-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathwordBreakII.java
63 lines (56 loc) · 2.06 KB
/
wordBreakII.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//the lowest acceptance rates of Leetcode
//first use bfs the create a two dimensional array
// use bfs the find all such possible sentences constructed by words in dictionary
public class Solution {
int [] state;
HashMap<Integer, ArrayList<Integer>> wordsMap = new HashMap<Integer, ArrayList<Integer>>();
public void dp(String s, Set<String> dict) {
int i = 0;
for(i=1;i<=s.length();i++) {
for(int j=0;j<i;j++) {
if(state[j]==1&&dict.contains(s.substring(j,i))) {
state[i] = 1;
ArrayList<Integer> array = wordsMap.get(i);
if(array==null) {
array = new ArrayList<Integer>();
array.add(j);
wordsMap.put(i, array);
} else {
array.add(j);
}
}
}
}
}
public ArrayList<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> ret = new ArrayList<String>();
if (s==null || s.length()==0 ||dict.size()==0 ) {
return ret;
}
state = new int [s.length() + 1];
state[0] = 1;
StringBuilder cur = new StringBuilder();
dp(s,dict);
if(state[s.length()]!=1) {
return ret;
}
dfs(s, s.length(), cur, ret, dict);
return ret;
}
public void dfs(String s, int start, StringBuilder cur, ArrayList<String> ret, Set<String> dict) {
StringBuilder tmp = new StringBuilder(cur);
if(start==0) {
ret.add(new String(cur));
return;
}
ArrayList<Integer> array = wordsMap.get(start);
for(int i=0;i<array.size();i++) {
StringBuilder tt = new StringBuilder(cur);
if(tt.length()!=0) {
tt = tt.insert(0," ");
}
tt.insert(0,s.substring(array.get(i),start));
dfs(s, array.get(i),tt,ret,dict);
}
}
}