美文网首页
140. Word Break II

140. Word Break II

作者: Super_Alan | 来源:发表于2018-05-01 14:10 被阅读0次

LeetCode Link

题目:Given string and dictionary, 求取 breakable 的所有组合

思路:Divide and conquer

public ArrayList<String> wordBreak(String s, List<String> wordDict) {
    Map<String, ArrayList<String>> map = new HashMap<>();
    Set<String> dict = new HashSet<>(wordDict);
    
    return wordBreakHelper(s, dict, map);
}

// divide and conquer
private ArrayList<String> wordBreakHelper(String s, Set<String> dict, Map<String, ArrayList<String>> map) {
    if (map.containsKey(s)) {
        return map.get(s);
    }
    
    ArrayList<String> newList = new ArrayList<>();
    if (dict.contains(s)) {
        newList.add(s);
    }
    
    for (int i = 1; i < s.length(); i++) {
        String possibleWord = s.substring(0, i);
        if (dict.contains(possibleWord)) {
            ArrayList<String> wordsList = wordBreakHelper(s.substring(i), dict, map);
            for (String words: wordsList) {
                newList.add(possibleWord + " " + words);
            }
        }
    }
    
    map.put(s, newList);
    return newList;
}

求取所有组合,DP 并不适合这类题目。DP 适合的题目:

  1. 是否存在解
  2. 最大、最小
  3. Count(*): Word Break 所有组合的数目,Word Break iii

Word Break III

LintCode Link

返回所有 break 方式的数量

dp[0][i] = sum(dp[0][j] * dp[j][i]) where j >= 0 && j < i

Solution Link

public int wordBreak3(String s, Set<String> dict) {
    int n = s.length();
    String lowerS = s.toLowerCase();
    
    Set<String> lowerDict = new HashSet<String>();
    for(String str : dict) {
        lowerDict.add(str.toLowerCase());
    }
    int[][] dp = new int[n][n];
    for(int i = 0; i < n; i++){
        for(int j = i; j < n;j++){
            String sub = lowerS.substring(i, j + 1);
            if(lowerDict.contains(sub)){
                dp[i][j] = 1;
            }
        }
    }
    for(int i = 0; i < n; i++){
        for(int j = i; j < n; j++){
            for(int k = i; k < j; k++){
                dp[i][j] += (dp[i][k] * dp[k + 1][j]);
            }
        }
    }
    return dp[0][n - 1];
}

根据上面的题解,我的题解:

    public int wordBreak3(String s, Set<String> wordDict) {
        s = s.toLowerCase();
        int len = s.length();
        
        Set<String> dict = new HashSet<>();
        for (String word: wordDict) {
            dict.add(word.toLowerCase());
        }
        
        int[][] dp = new int[len + 1][len + 1];
        for (int i = 1; i <= len; i++) {
            for (int j = 0; j < i; j++) {
                String possibleWord = s.substring(j, i);
                if (dict.contains(possibleWord)) {
                    dp[j][i] = 1;
                }
            }
        }
        
        // 尚未完成
        for (int i = 1; i <= len; i++) {
            for (int j = 0; j < i; j++) {
                dp[j][i] = 
            }
        }

相关文章

网友评论

      本文标题:140. Word Break II

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