Write a function to generate the generalized abbreviations of a word.spa
Example:
Given word = "word", return the following list (order does not matter):3d["word", "1ord", "w1rd", "wo1d", "wor1", "2rd", "w2d", "wo2", >"1o1d", "1or1", "w1r1", "1o2", "2r1", "3d", "w3", "4"]
這道題第一步必定要理解題意,首先要考慮的是會有多少種結果。仔細觀察會發現,最終會有Cn0 + Cn1 + Cn2 + ... + Cnn = 2^n種結果。
而後就很顯然應該用DFS, 每次recursion存下當前結果,而後繼續DFS。要注意下一步DFS的起始位置要與當前結束位置隔一個,不然就會出現有連續數字的結果,不但願出現連續數字的緣由是由於連續數字能夠合併成一個數字,已經算進去了,好比ab111就是ab3, 咱們要的結果是ab3。code
time: O(2^n), space: O(n)string
public class Solution { public List<String> generateAbbreviations(String word) { List<String> res = new ArrayList<>(); dfs(res, "", 0, word); return res; } public void dfs(List<String> res, String curr, int start, String s) { res.add(curr + s.substring(start)); if (start == s.length()) return; // 定義新的起始位置 int i = 0; // 除了最開始,起始位置都要與以前結尾位置隔一個 if (start > 0) { i = start + 1; } for (; i < s.length(); i++) { String prefix = curr + s.substring(start, i); // 以ith字符開頭,依次替換j個字母成數字。 for (int j = 1; j <= s.length() - i; j++) { dfs(res, prefix+ j, i + j, s); } } } }