LC140. 单词拆分 II

  • 总体思路采用的是字典树+回溯
class Solution {

    static class Trie {
        // 这里特别搞笑,居然可以缩小到20;本来设置的是100010的,一看好多人比我快,不行,调试一下哈哈哈
        int[][] son = new int[20][26];
        int[] cnt = new int[20];
        int idx = 0;

        // insert操作
        public void insert(char[] str) {
            int p = 0;
            for (int i = 0; i < str.length; i ++) {
                int u = str[i] - 'a'; // char转int
                // 判断树中是否有这个结点,如果没有就新建一个
                if (son[p][u] == 0) son[p][u] = ++idx;
                p = son[p][u]; // 走到下一个结点
            }
            // 走完以后说明这个是终点,记录一下P是终点
            cnt[p] ++;
        }

        // 查询操作
        public int query(char[] str) {
            int p = 0;
            for (int i = 0; i < str.length; i ++) {
                int u = str[i] - 'a';
                // 与插入几乎一致,就是不同在于如果没有这个结点那直接返回0了;
                if (son[p][u] == 0) return 0;
                p = son[p][u];
            }
            return cnt[p];
        }
    }

    List<String> ans = new ArrayList<>();
    public List<String> wordBreak(String s, List<String> wordDict) {
        Trie trie = new Trie();
        // 把字典都加入到Trie中
        for (String dict : wordDict) {
            trie.insert(dict.toCharArray());
        }
        //System.out.println(trie.query(("cat").toCharArray()));
        dfs(s, s.length(), 0, trie,  new ArrayList<String>());
        return ans;
        
    }

    // 回溯
    public void dfs(String word, int len, int index, Trie trie, ArrayList<String> list) {
        // 如果长度已经满足,说明遍历成功,退出
        if (index == len) {
            // 在list中的元素之间插入" "然后返回一个String
            ans.add(String.join(" ", new ArrayList(list)));
            return;
        }
        // 遍历从index + 1开始,因为index之前的子串都满足了, 新子串那长度至少要为1;
        for (int i = index + 1; i <= len; i ++) {
            String str = word.substring(index, i);
            // 如果存在这样一个字符
            if (trie.query(str.toCharArray()) > 0) {
                list.add(str);
                dfs(word, len, i, trie, list); // 回溯操作
                list.remove(list.size() - 1);
            } 
        }

    }


}

你可能感兴趣的:(算法,java,算法)