1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public List<String> wordBreak(String s, List<String> wordDict) { Set<String> dictSet = new HashSet<>(wordDict); List<String> ans = new ArrayList<>(); helper(ans, s, new StringBuilder(), dictSet, 0); return ans; }
private void helper(List<String> ans, String s, StringBuilder curr, Set<String> dictSet, int ptr) { if (ptr == s.length()) { ans.add(curr.toString().trim()); return; } for (int i = ptr + 1; i <= s.length(); i++) { String currString = s.substring(ptr, i); if (dictSet.contains(currString)) { curr.append(currString).append(' '); helper(ans, s, curr, dictSet, i); curr.delete(curr.length() - (currString.length() + 1), curr.length()); } } } }
|
backtrack就完事儿了.
时间复杂度: O(2^n) 比如aaaaaaaaaaaa, dict是[a, aa, aaa, aaaa, aaaaa]
空间复杂度: O(n) 每一个栈都代表截取了原string的一部分. 因此最多每个截取都是1个char.