[LeetCode]Generalized Abbreviation

Generalized Abbreviation

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);
            }
        }
    }
}
相关文章
相关标签/搜索