C ++中的最小唯一单词缩写
假设我们有一个字符串,例如“ word”,其中包含以下缩写:[“ word”,“ 1ord”,“ w1rd”,“ wo1d”,“ wor1”,“ 2rd”,“ w2d”,“ wo2”, “ 1o1d”,“ 1or1”,“ w1r1”,“ 1o2”,“ 2r1”,“ 3d”,“ w3”,“ 4”]]。我们在字典中也有一个目标字符串和一组字符串,我们必须找到该目标字符串的缩写,且长度要尽可能短,以免与字典中字符串的缩写冲突。在这里,缩写中的每个数字或字母都被认为是length =1。因此,作为示例,缩写“ a32bc”的长度为4。
因此,如果输入就像“苹果”,而字典是[“刀片”],那么输出将是“ a4”
为了解决这个问题,我们将遵循以下步骤-
定义数组字典
定义一个函数
abbrLen()
,它将带有掩码,ret:= n
对于初始化b:= 3,当b <bn时,更新b << = 1,执行-
(将retret减少1)
如果(mask AND b)等于0,则-
返回ret
定义一个函数
dfs()
,将需要位,掩码,len:= abbrLen(掩码)
如果len> = minLen,则-
返回
匹配:= true
对于字典中的每个d,执行-
匹配:=否
从循环中出来
如果(mask AND d)等于0,则-
如果match为非零,则-
minLen:= len
minab:=面膜
否则-
如果(cand AND b)不等于0,则-
dfs(b * 2,遮罩或b)
对于初始化b:=位,当b <bn时,更新b:= b * 2,执行-
从主要方法中执行以下操作-
ret:=空字符串
n:=目标大小
bn:= 2 ^ n
坎德:= 0
minLen:= inf
对于字典中的每个s-
如果s [i]不等于target [i],则-
单词:=单词OR(2 ^ i)
忽略以下部分,跳至下一个迭代
如果s的大小不等于n,则-
字:= 0
对于初始化i:= 0,当i <s的大小时,更新(将i增加1),执行-
在字典末尾插入单词
cand:= cand OR word
dfs(1,0)
对于初始化i:= 0,当i <n时-
j:=我
而(i <n和(minab AND 2 ^ i)等于0),-
ret:= ret级联(i-j)
(将i增加1)
ret:= ret +目标[i]
(将i增加1)
如果(minab AND 2 ^ i)不等于0,则-
除此以外
返回ret
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>using namespace std;
class Solution {
public:
int n, cand, bn, minLen, minab;
vector<int> dict;
int abbrLen(int mask) {
int ret = n;
for (int b = 3; b < bn; b <<= 1) {
if ((mask & b) == 0)
ret--;
}
return ret;
}
void dfs(int bit, int mask) {
int len = abbrLen(mask);
if (len >= minLen)
return;
bool match = true;
for (int d : dict) {
if ((mask & d) == 0) {
match = false;
break;
}
}
if (match) {
minLen = len;
minab = mask;
}
else {
for (int b = bit; b < bn; b <<= 1) {
if ((cand & b) != 0)
dfs(b << 1, mask | b);
}
}
}
string minAbbreviation(string target, vector<string> &dictionary) {
string ret = "";
n = target.size();
bn = 1 << n;
cand = 0;
minLen = INT_MAX;
for (string &s : dictionary) {
if (s.size() != n)
continue;
int word = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] != target[i])
word |= (1 << i);
}
dict.push_back(word);
cand |= word;
}
dfs(1, 0);
for (int i = 0; i < n;) {
if ((minab & (1 << i)) != 0) {
ret += target[i];
i++;
}
else {
int j = i;
while (i < n && (minab & (1 << i)) == 0)
i++;
ret += to_string(i - j);
}
}
return ret;
}
};
main() {
Solution ob;
vector<string> v = {"blade"};
cout << (ob.minAbbreviation("apple",v));
}
输入项
"apple",{"blade"}
输出结果
a4
以上是 C ++中的最小唯一单词缩写 的全部内容, 来源链接: utcz.com/z/334981.html