public List<String> wordBreak(String s, Set<String> wordDict) {
return word_Break(s, wordDict, 0);
}
public List<String> word_Break(String s, Set<String> wordDict, int start) {
LinkedList<String> res = new LinkedList<>();
if (start == s.length()) {
res.add("");
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end))) {
List<String> list = word_Break(s, wordDict, end);
for (String l : list) {
res.add(s.substring(start, end) + (l.equals("") ? "" : " ") + l);
}
}
}
return res;
}
public List<String> wordBreak(String s, Set<String> wordDict) {
return word_Break(s, wordDict, 0);
}
HashMap<Integer, List<String>> map = new HashMap<>();
public List<String> word_Break(String s, Set<String> wordDict, int start) {
if (map.containsKey(start)) {
return map.get(start);
}
LinkedList<String> res = new LinkedList<>();
if (start == s.length()) {
res.add("");
}
for (int end = start + 1; end <= s.length(); end++) {
if (wordDict.contains(s.substring(start, end))) {
List<String> list = word_Break(s, wordDict, end);
for (String l : list) {
res.add(s.substring(start, end) + (l.equals("") ? "" : " ") + l);
}
}
}
map.put(start, res);
return res;
}
下面是例子,如果用了hashmap优化,我们知道位置2已经搜过了,以后再搜的时候,直接返回
substring : a substring : a
substring : a substring : a
substring : a substring : a
substring : aa substring : aa
search this before : 3
substring : aa substring : aa
search this before : 2
substring : aaa substring : a
search this before : 3
[a a a, a aa, aa a, aaa] substring : aaa
[a a a, a aa, aa a, aaa]