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

    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"].

    二维DP +DFS:

     1 public class Solution {
     2     int len = 0;
     3     boolean[][] map = null;
     4     ArrayList<String> al = null;
     5     public ArrayList<String> wordBreak(String s, Set<String> dict) {
     6         // Note: The Solution object is instantiated only once and is reused by each test case.
     7         al = new ArrayList<String>();
     8         if(s == null || s.length() == 0) return al;
     9         len = s.length();
    10         map = new boolean[len][len + 1];
    11         for(int i = len - 1; i > -1; i --){
    12             for(int j = i + 1; j <= len; j ++){
    13                 String ss = s.substring(i,j);
    14                 if(dict.contains(ss) && j == len){
    15                     map[i][j - 1] = true;
    16                     map[i][len] = true;
    17                 }
    18                 else if(dict.contains(ss) && j < len && map[j][len] == true){
    19                     map[i][j - 1] = true;
    20                     map[i][len] = true;
    21                 }
    22             }
    23         }
    24         if(map[0][len] != true) return al;
    25         get(new StringBuffer(),0,s);
    26         return al;
    27     }
    28     public void get(StringBuffer sb, int i,String s){
    29         if(i == len){
    30             String sa = sb.toString();
    31             al.add(sa.substring(0,sa.length() - 1));
    32             return;
    33         }
    34         if(map[i][len] == false)
    35             return;
    36         for(int j = i; j < len; j ++){
    37             if(map[i][j] == true){
    38                 StringBuffer cur = new StringBuffer();
    39                 cur.append(sb.toString());
    40                 cur.append(s.substring(i,j + 1));
    41                 cur.append(" ");
    42                 get(cur,j + 1,s);
    43             }
    44         }
    45     }
    46 }
     1 public class Solution {
     2     public static ArrayList<String> wordBreak(String s, Set<String> dict) {
     3         ArrayList<String> result = new ArrayList<String>();
     4         if (s == null || dict.size() <= 0) {
     5             return result;
     6         }
     7         int length = s.length();
     8         // seg(i, j) means substring t start from i and length is j can be
     9         // segmented into
    10         // dictionary words
    11         boolean[][] seg = new boolean[length][length + 1];
    12         for (int len = 1; len <= length; len++) {
    13             for (int i = 0; i < length - len + 1; i++) {
    14                 String t = s.substring(i, i + len);
    15                 if (dict.contains(t)) {
    16                     seg[i][len] = true;
    17                     continue;
    18                 }
    19                 for (int k = 1; k < len; k++) {
    20                     if (seg[i][k] && seg[i + k][len - k]) {
    21                         seg[i][len] = true;
    22                         break;
    23                     }
    24                 }
    25             }
    26         }
    27         if (!seg[0][length]) {
    28             return result;
    29         }
    30 
    31         int depth = 0;
    32         dfs(s, seg, 0, length, depth, result, new StringBuffer(), dict);
    33 
    34         return result;
    35     }
    36 
    37     private static void dfs(String s, boolean[][] seg, int start, int length,
    38             int depth, ArrayList<String> result, StringBuffer sb, Set<String> dict) {
    39         if (depth == length) {
    40             String t = sb.toString();
    41             result.add(t.substring(0, t.length() - 1));
    42             return;
    43         }
    44 
    45         for (int len = 1; len <= length; len++) {
    46             if (seg[start][len]) {
    47                 String t = s.substring(start, start + len);
    48                 if(!dict.contains(t)){
    49                     continue;
    50                 }
    51                 int beforeAddLen = sb.length();
    52                 sb.append(t).append(" ");
    53                 dfs(s, seg, start + len, length, start + len, result, sb, dict);
    54                 sb.delete(beforeAddLen, sb.length());
    55             }
    56         }
    57     }
    58 }
  • 相关阅读:
    JavaSE-方法覆盖的注意事项
    underscore.js源码研究(4)
    underscore.js源码研究(3)
    移动端font-size适配方案
    控制台引入想要的库
    页面布局与编写(续3)
    underscore.js源码研究(2)
    全屏使用swiper.js过程中遇到的坑
    模块加载
    underscore.js源码研究(1)
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3359102.html
Copyright © 2011-2022 走看看