Skip to content

Latest commit

 

History

History
133 lines (97 loc) · 3.41 KB

File metadata and controls

133 lines (97 loc) · 3.41 KB

English Version

题目描述

单词的 广义缩写词 可以通过下述步骤构造:先取任意数量的不重叠的子字符串,再用它们各自的长度进行替换。

例如:

  • "abcde" 可以缩写为 "a3e""bcd" 变为 "3"
  • "1bcd1""a""e" 都变为 "1"
  • "5""abcde" 变为 "5"

但是,这些缩写是无效的:

  • "23""ab" 变为 "2""cde" 变为 "3" ),选择的子串是相邻的。
  • "22de""ab" 变为 "2""bc" 变为 "2" ),选择的子串重叠了。

给你一个字符串 word ,返回一个由所有可能 广义缩写词 组成的列表。按 任意顺序 返回答案。

 

示例 1:

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

示例 2:

输入:word = "a"
输出:["1","a"]

 

提示:

  • 1 <= word.length <= 15
  • word 仅由小写英文字母组成

解法

回溯法。

Python3

class Solution:
    def generateAbbreviations(self, word: str) -> List[str]:
        def dfs(s, t):
            if not s:
                ans.append(''.join(t))
                return
            for i in range(1, len(s) + 1):
                t.append(str(i))
                if i < len(s):
                    t.append(s[i])
                    dfs(s[i + 1:], t)
                    t.pop()
                else:
                    dfs(s[i:], t)
                t.pop()

            t.append(s[0])
            dfs(s[1:], t)
            t.pop()

        ans = []
        dfs(word, [])
        return ans

Java

class Solution {
    private List<String> ans;

    public List<String> generateAbbreviations(String word) {
        ans = new ArrayList<>();
        List<String> t = new ArrayList<>();
        dfs(word, t);
        return ans;
    }

    private void dfs(String s, List<String> t) {
        if ("".equals(s)) {
            ans.add(String.join("", t));
            return;
        }
        for (int i = 1; i < s.length() + 1; ++i) {
            t.add(i + "");
            if (i < s.length()) {
                t.add(String.valueOf(s.charAt(i)));
                dfs(s.substring(i + 1), t);
                t.remove(t.size() - 1);
            } else {
                dfs(s.substring(i), t);
            }
            t.remove(t.size() - 1);
        }
        t.add(String.valueOf(s.charAt(0)));
        dfs(s.substring(1), t);
        t.remove(t.size() - 1);
    }
}

...