Write a function to generate the generalized abbreviations of a word.(order does not matter)
Example
Example 1:
Input:
word = “word”,
Output:
[“word”, “1ord”, “w1rd”, “wo1d”, “wor1”, “2rd”, “w2d”, “wo2”, “1o1d”, “1or1”, “w1r1”, “1o2”, “2r1”, “3d”, “w3”, “4”]
Example 2:
Input:
word = “today”
Output:
[“1o1a1”,“1o1ay”,“1o2y”,“1o3”,“1od1y”,“1od2”,“1oda1”,“1oday”,“2d1y”,“2d2”,“2da1”,“2day”,“3a1”,“3ay”,“4y”,“5”,“t1d1y”,“t1d2”,“t1da1”,“t1day”,“t2a1”,“t2ay”,“t3y”,“t4”,“to1a1”,“to1ay”,“to2y”,“to3”,“tod1y”,“tod2”,“toda1”,“today”]
解法1:BFS
注意对每个pos,都要有i,j两层循环,其中i循环负责把pos从当前位置累加到n - 1,j循环负责把替换长度从1累加到word.size()-i。
代码如下:
class Solution {
public:
/**
* @param word: the given word
* @return: the generalized abbreviations of a word
*/
vector<string> generateAbbreviations(string &word) {
int n = word.size();
dfs(word, 0);
result.push_back(word);
return result;
}
private:
vector<string> result;
void dfs(string word, int pos) {
int n = word.size();
if (pos > n) return;
for (int i = pos; i < n; ++i) {
for (int j = 1; j <= n - i; ++j) {
string tmpStr = word.substr(0, i);
tmpStr += to_string(j) + word.substr(i + j);
result.push_back(tmpStr);
dfs(tmpStr, i + to_string(j).size() + 1);
}
}
}
};