2022-01-22:力扣411,最短独占单词缩写。
给一个字符串数组strs和一个目标字符串target。target的简写不能跟strs打架。
strs是[“abcdefg”,“ccc”],target是"moonfdd"。target简写形式如果是"7",会跟strs中的"abcdefg"打架,因为"abcdefg"简写形式也可以是"7"。target简写形式如果是"m6",这就不会打架了,因为strs中没有以m开头,并且还有6个字符的字符串。
所以target的缩写就是"m6"。

答案2022-01-22:

递归。target的每个字符保留还是不保留。
字符串数组中跟目标字符串一样长的字符串,可以用位运算。比如"abcdefg"可以表示成0b111111,"moxnfdd"可以表示成0b0010000。相同为0,不同为1。

代码用golang编写。代码如下:

package main

import (
"fmt"
"math"
) func main() {
dictionary := []string{"abcdefd", "ccc"}
target := "moonfdd"
ret := minAbbreviation1(target, dictionary)
fmt.Println(ret)
ret = minAbbreviation2(target, dictionary)
fmt.Println(ret)
} // 区分出来之后,缩写的长度,最短是多少?
var min = math.MaxInt64 // 取得缩写的长度最短的时候,决定是什么(fix)
var best = 0 func minAbbreviation2(target string, dictionary []string) string {
min = math.MaxInt64
best = 0
//char[] t = target.toCharArray();
t := []byte(target)
len0 := len(t)
siz := 0
for _, word := range dictionary {
if len(word) == len0 {
siz++
}
}
words := make([]int, siz)
index := 0
// 用来剪枝
diff := 0
for _, word := range dictionary {
if len(word) == len0 {
w := []byte(word)
status := 0
for j := 0; j < len0; j++ {
if t[j] != w[j] {
status |= 1 << j
}
}
words[index] = status
index++
diff |= status
}
}
dfs2(words, len0, diff, 0, 0)
builder := ""
count := 0
for i := 0; i < len0; i++ {
if (best & (1 << i)) != 0 {
if count > 0 {
builder += fmt.Sprint(count)
}
builder += fmt.Sprintf("%c", t[i])
count = 0
} else {
count++
}
}
if count > 0 {
builder += fmt.Sprint(count)
}
return builder
} func dfs2(words []int, len0, diff, fix, index int) {
if !canFix(words, fix) {
if index < len0 {
dfs2(words, len0, diff, fix, index+1)
if (diff & (1 << index)) != 0 {
dfs2(words, len0, diff, fix|(1<<index), index+1)
}
}
} else {
ans := abbrLen(fix, len0)
if ans < min {
min = ans
best = fix
}
}
} // 原始的字典,被改了
// target : abc 字典中的词 : bbb -> 101 -> int ->
// fix -> int -> 根本不用值,用状态 -> 每一位保留还是不保留的决定
func canFix(words []int, fix int) bool {
for _, word := range words {
if (fix & word) == 0 {
return false
}
}
return true
} func abbrLen(fix, len0 int) int {
ans := 0
cnt := 0
for i := 0; i < len0; i++ {
if (fix & (1 << i)) != 0 {
ans++
if cnt != 0 {
if cnt > 9 {
ans += 2 - cnt
} else {
ans += 1 - cnt
}
}
cnt = 0
} else {
cnt++
}
}
if cnt != 0 {
if cnt > 9 {
ans += 2 - cnt
} else {
ans += 1 - cnt
}
}
return ans
} // 利用位运算加速
func minAbbreviation1(target string, dictionary []string) string {
min = math.MaxInt64
best = 0
t := []byte(target)
len0 := len(t)
siz := 0
for _, word := range dictionary {
if len(word) == len0 {
siz++
}
}
words := make([]int, siz)
index := 0
for _, word := range dictionary {
if len(word) == len0 {
w := []byte(word)
status := 0
for j := 0; j < len0; j++ {
if t[j] != w[j] {
status |= 1 << j
}
}
words[index] = status
index++
}
}
dfs1(words, len0, 0, 0)
//StringBuilder builder = new StringBuilder();
builder := ""
count := 0
for i := 0; i < len0; i++ {
if (best & (1 << i)) != 0 {
if count > 0 {
builder += fmt.Sprint(count)
}
builder += fmt.Sprintf("%c", t[i])
count = 0
} else {
count++
}
}
if count > 0 {
builder += fmt.Sprint(count)
}
return builder
} // 所有字典中的单词现在都变成了int,放在words里
// 0....len-1 位去决定保留还是不保留!当前来到index位
// 之前做出的决定!
func dfs1(words []int, len0, fix, index int) {
if !canFix(words, fix) {
if index < len0 {
dfs1(words, len0, fix, index+1)
dfs1(words, len0, fix|(1<<index), index+1)
}
} else {
// 决定是fix,一共的长度是len,求出缩写是多长?
ans := abbrLen(fix, len0)
if ans < min {
min = ans
best = fix
}
}
}

执行结果如下:


左神java代码

2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数组strs和一个目标字符串target。target的简写不能跟strs打架。 strs是[“abcdefg“,“ccc“],tar的更多相关文章

  1. 力扣算法题—079单词搜索【DFS】

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...

  2. 力扣(LeetCode)453. 最小移动次数使数组元素相等

    给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数.每次移动可以使 n - 1 个元素增加 1. 示例: 输入: [1,2,3] 输出: 3 解释: 只需要3次移动(注意每次移动 ...

  3. 力扣 —— Two Sum ( 两数之和) python实现

    题目描述: 中文: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  4. 力扣题解-LCP 06. 拿硬币

    题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释: ...

  5. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  6. 力扣(leetcode)题库0001-python3

    试一下leetcode的题库,不知道对于我这种小白要多长时,但是目标已经种下,去做就是了.You can do anything you set your mind to. 题目:题库链接 中:给定一 ...

  7. [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写

    A string such as "word" contains the following abbreviations: ["word", "1or ...

  8. JS数据结构第六篇 --- 二叉树力扣练习题

    1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...

  9. 用GA算法设计22个地点之间最短旅程-R语言实现

    数据挖掘入门与实战  公众号: datadw 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ----------------------------- ...

  10. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

随机推荐

  1. 一个struts1框架的小案例

    具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding=" ...

  2. html、css、js 压缩或混淆方法

    普通的压缩代码的方法包括在线工具和服务器打包处理,有一个共同的痛点是:压缩后的代码无法还原成原始的带有注释的源代码.正如大家所知,在源代码中调试Bug事半功倍.在线工具HCJCompress(ihon ...

  3. hydra暴力破解各种服务

    hydra 在爆破工具中,hydra可是数一数二的存在,是著名黑客组织thc开发的一款开源的暴力密码破解工具,可以在线破解多种密码 参数 作用 -l 指定用户名 -p 指定密码 -L 指定用户字典 - ...

  4. [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)

    预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...

  5. SaaS、PaaS、IaaS区别

    SaaS SaaS 越久,觉得它个庞大的领域 SaaS 收入的"长江流域". 传统软件像买房:什么都得自己买,价格昂贵,一般人用不起.SaaS模式就像是租赁预先装修好的共享公寓,拎 ...

  6. Etherscan本地多文件开源(VScode)

    项目创建 创建文件夹  mkdir Duckereum ​ cdDuckereum 添加nodejs配置  npm init -y 安装依赖添加  npm install -D hardhat npm ...

  7. MySQL的group_concat()函数简单用法

    将group by产生的同一个分组中的值连接起来,返回一个字符串结果. group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔.由函数参数(字段名 ...

  8. KubeSphere 高可用集群搭建并启用所有插件

    介绍 大多数情况下,单主节点集群大致足以供开发和测试环境使用.但是,对于生产环境,您需要考虑集群的高可用性.如果关键组件(例如 kube-apiserver.kube-scheduler 和 kube ...

  9. flask基本项目结构

    |-- myproject |-- config.py |-- flask-env.yml |-- manage.py |-- app | |-- models.py | |-- __init__.p ...

  10. 清理过时的.NET SDK 和 运行时

    TL;DR .NET 卸载工具 随着这几年.NET 的快速发展,电脑上的.NET SDK 和 runtime 也在不断的积累.每个sdk动辄都是上百兆的空间占用,很快本来就不富裕的C盘空间就更加紧俏了 ...