美文网首页
DP/DFS - LC139/140 Word Break

DP/DFS - LC139/140 Word Break

作者: 风烨 | 来源:发表于2017-11-18 06:56 被阅读0次

第一题是确定是否可以断句,第二题是输出所有断句的可能性。第二题可以用到了第一题的判读来加速,是否进行Solution的check。

class Solution {
    public static String empty = " ";
    public List<String> wordBreak(String s, List<String> wordDict) {
        Set<String> set = new HashSet(wordDict.size());
        int min = Integer.MAX_VALUE, max = 0;
        for(String word : wordDict){
            int l = word.length();
            min = Integer.min(l, min);
            max = Integer.max(l, max);
            set.add(word);
        }
        
        if(hasSolution(s, set, min, max)){
            List<List<String>> dp = new ArrayList<>(s.length() + 1);
            for(int i = 0; i <= s.length(); i++) dp.add(new ArrayList()); // init dp with emply array
            dp.get(s.length()).add("");
            for(int i = s.length() - 1; i >= 0; --i) {
                for(int j = i + 1; j <= s.length(); ++j) {
                    int l = j - i;
                    String check = s.substring(i, j);
                    if (l >= min && l <= max && set.contains(check)) {
                        for(String word : dp.get(j)) {
                            dp.get(i).add(check.concat(word.isEmpty() ? word : (empty + word)));
                        }
                    }
                }
            }
            return dp.get(0);
        }
        
        return new ArrayList();
    }
    
    //LC 139 solution
    public boolean hasSolution(String s, Set<String> set, int min, int max){
        boolean[] dp = new boolean[s.length()+1];
        dp[0] = true;
        for(int i = min; i <= s.length(); ++i){
            for(int j = 0; j < i; ++j){
                int l = i - j;
                if(dp[j] && l >= min && l <= max && set.contains(s.substring(j, i))){
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }
}

   //超时的简洁版DFS判断是否有Solution
    public boolean dfs(String s, Set<String> set, int min, int max){
        if(s.isEmpty()) return true;
        for(int j = min; j <= max && j <= s.length(); ++j){
            if(set.contains(s.substring(0, j)) && dfs(s.substring(j, s.length()), set, min, max)){
                return true;
            }
        }
        return false; 
    }
     

相关文章

网友评论

      本文标题:DP/DFS - LC139/140 Word Break

      本文链接:https://www.haomeiwen.com/subject/tjasvxtx.html