-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWordBreak1.java
More file actions
139 lines (123 loc) · 4.54 KB
/
Copy pathWordBreak1.java
File metadata and controls
139 lines (123 loc) · 4.54 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package dp;
import org.junit.Test;
import java.util.*;
/**
* @Author: wei1
* @Date: Create in 2018/11/9 20:02
* @Description: 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.
* <p>
* Return all such possible sentences.
* <p>
* For example, given
* s ="catsanddog",
* dict =["cat", "cats", "and", "sand", "dog"].
* <p>
* A solution is["cats and dog", "cat sand dog"].
* <p>
* 这题要用dp不然时间会超时,思路就是从后往前递归算,普通的从前往后的dfs不写
*/
public class WordBreak1 {
public ArrayList<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> result = new ArrayList<>();
if (dict == null || dict.size() == 0 || s == null || s.length() == 0) {
return result;
}
ArrayList<String> list = new ArrayList<>();
ArrayList<String> di = new ArrayList<>();
Iterator<String> iterator = dict.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (s.contains(str)) {
di.add(str);
}
}
int nums = di.size();
boolean[] color = new boolean[nums];
for (int i = 0; i < nums; i++) {
color[i] = false;
}
dfs(result, list, di, color, s);
return result;
}
private void dfs(ArrayList<String> result, ArrayList<String> list, ArrayList<String> dict,
boolean[] color, String s) {
if (toStr(list).equals(s)) {
result.add(toSpaceStr(list));
}
for (int i = 0; i < dict.size(); i++) {
if (!color[i]) {
String toS = toStr(list) + dict.get(i);
if (s.startsWith(toS)) {
list.add(dict.get(i));
color[i] = true;
dfs(result, list, dict, color, s);
list.remove(list.size() - 1);
color[i] = false;
}
}
}
}
private String toSpaceStr(ArrayList<String> list) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
s.append(list.get(i) + " ");
}
String str = s.toString();
return str.trim();
}
private String toStr(ArrayList<String> list) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
s.append(list.get(i));
}
return s.toString();
}
public ArrayList<String> wordBreak1(String s, Set<String> dict) {
HashMap<String, List<String>> dpMap = new HashMap<>(16);
return dfs(s, dict, dpMap);
}
public ArrayList<String> dfs(String s, Set<String> dict, HashMap<String, List<String>> map) {
if (map.containsKey(s)) {
return (ArrayList<String>) map.get(s);
}
ArrayList<String> lists = new ArrayList();
if (s.equals("")) {
lists.add("");
} else {
int len = s.length();
for (int i = 1; i <= len; i++) {
String sub = s.substring(0, i);
if (dict.contains(sub)) {
ArrayList t = dfs(s.substring(i, len), dict, map);
if (t.size() == 0) {
continue;
} else {
for (int j = 0; j < t.size(); j++) {
StringBuilder sb = new StringBuilder();
sb.append(sub).append(" ").append(t.get(j));
lists.add(sb.toString().trim());
}
}
}
}
}
map.put(s, lists);
return lists;
}
@Test
public void test() {
List<String> list = Arrays.asList("aaaa", "aa", "a");
/**
["a a a a a a a","aa a a a a a","a aa a a a a","a a aa a a a","aa aa a a a",
"aaaa a a a","a a a aa a a","aa a aa a a","a aa aa a a","a aaaa a a",
"a a a a aa a","aaa a aa a","a aa a aa a","a a aa aa a","aa aa aa a",
"aaaa aa a","a a aaaa a","aa aaaa a","a a a a a aa","aa a a a aa",
"a aa a a aa","a a aa a aa","aa aa a aa","aaaa a aa","a a a aa aa",
"aa a aa aa","a aaaa aa","a aaaa aa","a a a aaaa","aa a aaaa","a aa aaaa"]
*/
Set<String> dict = new HashSet<>(list);
String s = "aaaaaaa";
ArrayList<String> arrayList = wordBreak1(s, dict);
System.out.println(Arrays.toString(arrayList.toArray()));
}
}