Write a function to generate the generalized abbreviations of a word.

Note: The order of the output does not matter.

Example:

Input: "word"
Output:
["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", "1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]

这道题让我们对一个单词进行部分简写,简写的规则是若干个字母可以用数字来表示,但是不能有两个相邻的数字,具体可以参考题目中给的例子,根据我以往的经验,这种列举所有情况的必定是要用DFS来写的,但是我一时半会又没想到该咋递归,后来我数了一下题目中给的例子的所有情况的个数,是16个,而word有4个字母,刚好是2的4次方,这是巧合吗,当然不是,后来我又发现如果把0到15的二进制写出来,每一个可以对应一种情况,如下所示:

0000 word
0001 wor1
0010 wo1d
0011 wo2
0100 w1rd
0101 w1r1
0110 w2d
0111 w3
1000 1ord
1001 1or1
1010 1o1d
1011 1o2
1100 2rd
1101 2r1
1110 3d
1111 4

那么我们就可以观察出规律,凡是0的地方都是原来的字母,单独的1还是1,如果是若干个1连在一起的话,就要求出1的个数,用这个数字来替换对应的字母,既然规律找出来了,那么代码就很好写了,如下所示:

解法一:

class Solution {
public:
vector<string> generateAbbreviations(string word) {
vector<string> res;
for (int i = ; i < pow(, word.size()); ++i) {
string out = "";
int cnt = , t = i;
for (int j = ; j < word.size(); ++j) {
if (t & == ) {
++cnt;
if (j == word.size() - ) out += to_string(cnt);
} else {
if (cnt != ) {
out += to_string(cnt);
cnt = ;
}
out += word[j];
}
t >>= ;
}
res.push_back(out);
}
return res;
}
};

上述方法返回结果的顺序为:

["word","1ord","w1rd","2rd","wo1d","1o1d","w2d","3d","wor1","1or1","w1r1","2r1","wo2","1o2","w3","4"]

我们可以对上面代码稍稍改写一下,变的稍微简洁一点:

解法二:

class Solution {
public:
vector<string> generateAbbreviations(string word) {
vector<string> res;
for (int i = ; i < pow(, word.size()); ++i) {
string out = "";
int cnt = ;
for (int j = ; j < word.size(); ++j) {
if ((i >> j) & ) ++cnt;
else {
if (cnt != ) {
out += to_string(cnt);
cnt = ;
}
out += word[j];
}
}
if (cnt > ) out += to_string(cnt);
res.push_back(out);
}
return res;
}
};

那么迭代的写法看完了,来考虑一些递归的写法吧,上网搜了一下,发现下面三种写法比较容易理解,

解法三:

class Solution {
public:
vector<string> generateAbbreviations(string word) {
vector<string> res{word};
helper(word, , res);
return res;
}
void helper(string word, int pos, vector<string> &res) {
for (int i = pos; i < word.size(); ++i) {
for (int j = ; i + j <= word.size(); ++j) {
string t = word.substr(, i);
t += to_string(j) + word.substr(i + j);
res.push_back(t);
helper(t, i + + to_string(j).size(), res);
}
}
}
};

上述方法返回结果的顺序为:

["word","1ord","1o1d","1o2","1or1","2rd","2r1","3d","4","w1rd","w1r1","w2d","w3","wo1d","wo2","wor1"]

解法四:

class Solution {
public:
vector<string> generateAbbreviations(string word) {
vector<string> res;
helper(word, , , "", res);
return res;
}
void helper(string word, int pos, int cnt, string out, vector<string> &res) {
if (pos == word.size()) {
if (cnt > ) out += to_string(cnt);
res.push_back(out);
} else {
helper(word, pos + , cnt + , out, res);
helper(word, pos + , , out + (cnt > ? to_string(cnt) : "") + word[pos], res);
}
}
};

上述方法返回结果的顺序为:

["4","3d","2r1","2rd","1o2","1o1d","1or1","1ord","w3","w2d","w1r1","w1rd","wo2","wo1d","wor1","word"]

解法五:

class Solution {
public:
vector<string> generateAbbreviations(string word) {
vector<string> res;
res.push_back(word.size() == ? "" : to_string(word.size()));
for (int i = ; i < word.size(); ++i) {
for (auto a : generateAbbreviations(word.substr(i + ))) {
string left = i > ? to_string(i) : "";
res.push_back(left + word.substr(i, ) + a);
}
}
return res;
}
};

上述方法返回结果的顺序为:

["4","w3","wo2","wor1","word","wo1d","w1r1","w1rd","w2d","1o2","1or1","1ord","1o1d","2r1","2rd","3d"]

参考资料:

https://leetcode.com/problems/generalized-abbreviation/

https://leetcode.com/discuss/75754/java-backtracking-solution

https://leetcode.com/discuss/77280/c-straightforward-recursive-solution

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Generalized Abbreviation 通用简写的更多相关文章

  1. LeetCode Generalized Abbreviation

    原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/ 题目: Write a function to generate the ...

  2. [LeetCode] Word Abbreviation 单词缩写

    Given an array of n distinct non-empty strings, you need to generate minimal possible abbreviations ...

  3. [Swift]LeetCode320. 通用简写 $ Generalized Abbreviation

    Write a function to generate the generalized abbreviations of a word. Example: Given word = "wo ...

  4. LeetCode 320. Generalized Abbreviation

    原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/ 题目: Write a function to generate the ...

  5. 【LeetCode】320. Generalized Abbreviation 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...

  6. LeetCode Word Abbreviation

    原题链接在这里:https://leetcode.com/problems/word-abbreviation/description/ 题目: Given an array of n distinc ...

  7. 320. Generalized Abbreviation

    首先想到的是DFS,对于每个单词的字母都遍历,比如 spy: 1py,s1y,sp1 然后每个遍历完的单词再DFS..左右有数字就合并比如 1py: 11y=>2py, 1p1 这样.. 但是单 ...

  8. [Locked] Generalized Abbreviation

    Write a function to generate the generalized abbreviations of a word. Example:Given word = "wor ...

  9. LeetCode 527---Word Abbreviation

    527. Word Abbreviation Given an array of n distinct non-empty strings, you need to generate minimal ...

随机推荐

  1. php后台增删改跳转

    php登录页面: <h1>登录界面</h1> <form action="dengluchuli.php" method="post&quo ...

  2. scikit-learn一般实例之六:构建评估器之前进行缺失值填充

    本例将会展示对确实值进行填充能比简单的对样例中缺失值进行简单的丢弃能获得更好的结果.填充不一定能提升预测精度,所以请通过交叉验证进行检验.有时删除有缺失值的记录或使用标记符号会更有效. 缺失值可以被替 ...

  3. JDBC_part1_Oracle数据库连接JDBC以及查询语句

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! JDBC part1 JDBC概述 jdbc是一种用于 ...

  4. Maven对插件进行全局设置

    并不是所有插件都适合从命令行配置,有些参数的值从项目创建到发布都不会改变,或者很少改变,对于这种情况,在POM文件中一次性配置就显然比重复在命令行中输入要方便了. 用户可以在生命插件的时候,对插件进行 ...

  5. GJM : 常用网站收集 【不断更新中... ... ... 】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  6. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

  7. Canvas的width,height 和 样式中Canvas的width,height

    控制Canvas的大小,有两种方式: 1:直接设置Canvas标签上的书width,height属性值; 2:通过Css设置Canvas的width,height; 这两种方式,区别是很大的. 1:C ...

  8. 深入理解DOM节点类型第五篇——元素节点Element

    × 目录 [1]特征 [2]子节点 [3]特性操作[4]attributes 前面的话 元素节点Element非常常用,是DOM文档树的主要节点:元素节点是html标签元素的DOM化结果.元素节点主要 ...

  9. <![CDATA[的web使用简单说明

    html.javascript会涉及到三个解析器,html解析器.xml解析器.javascript解析器.那么好了,问题来了,以上代码经常混编在一起,各自有各自的规则,终究会有冲突的,如下就是冲突. ...

  10. Android Weekly Notes Issue #224

    Android Weekly Issue #224 September 25th, 2016 Android Weekly Issue #224 本期内容包括: Google Play的pre-lau ...