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 }

你可能感兴趣的:(break)