zoukankan      html  css  js  c++  java
  • Word Break II——LeetCode

    Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

    Return all such possible sentences.

    For example, given
    s = "catsanddog",
    dict = ["cat", "cats", "and", "sand", "dog"].

    A solution is ["cats and dog", "cat sand dog"].

    题目大意就是:给一个string,一个词典,把这个string根据词典构建出所有可能的组合。

    我的解法就是预处理+DFS+剪枝。

    1、首先用一个breakFlag数组,记录string中的各个位置为结尾是否是合法的分词末尾,以上面的样例来说,c,a都是不合法的分词结尾,t,s都是合法的分词结尾。

    2、然后用DFS来搜全部可能的组合,如果最后正好分完这个string,说明是合法的分词方法,组合成句子然后添加到结果List中,有个小优化就是可以先把字典里的单词的长度放入一个array,分词的时候只需要遍历这个array就可以,比如上面的字典里单词长度只有{3,4}组成一个array,只需要遍历cat cats就可以继续往后遍历了。

    Talk is cheap>>

    package leetcode;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    
    public class WordBreakII {
    
    
        public static void main(String[] args) {
            Set<String> set = new HashSet<String>();
            set.add("cat");
            set.add("cats");
            set.add("and");
            set.add("sand");
            set.add("dog");
            new WordBreakII().wordBreak("catsanddog", set);
        }
    
    
        Set<Integer> lenArray = new HashSet<>();
        boolean[] breakFlag;
    
        public List<String> wordBreak(String s, Set<String> dict) {
            List<String> res = new ArrayList<>();
            for (String next : dict) {
                lenArray.add(next.length());
            }
            breakFlag = new boolean[s.length() + 1];
            breakFlag[0] = true;
            for (int i = 0; i < s.length(); i++) {
                if (breakFlag[i]) {
                    for (int j = 0; i + j < s.length() + 1; j++) {
                        if (dict.contains(s.substring(i, i + j)))
                            breakFlag[i + j] = true;
                    }
                }
            }
            if (breakFlag[s.length()])
                dfs(s, "", dict, res, s.length());
            return res;
        }
    
        public void dfs(String src, String tmp, Set<String> dict, List<String> res, int length) {
            if (length < 0) {
                return;
            }
            if (length == 0) {
                System.out.println(tmp.substring(0, tmp.length() - 1));
                res.add(tmp.substring(0, tmp.length() - 1));
                return;
            }
            for (int len : lenArray) {
                int left = src.length() - len;
                if (left < 0)
                    break;
                String t = src.substring(left, src.length());
                if (breakFlag[length] && dict.contains(t)) {
                    dfs(src.substring(0, left), t + " " + tmp, dict, res, length - len);
                }
            }
        }
    
    
    }
  • 相关阅读:
    数组子数组求最大值1
    乐游 游戏论坛开发第二阶段
    软件开发第一天
    团队开发
    解决libpython2.6.so.1.0: cannot open shared object file
    linux卸载Python3
    在Linux上安装Python3.7.1
    Pytest高级进阶之Fixture
    发现使用id定位元操作不了
    报错:Original error: Could not proxy command to remote server. Original error: Error: read ECONNRESET
  • 原文地址:https://www.cnblogs.com/aboutblank/p/4390063.html
Copyright © 2011-2022 走看看