跟word break 相比,该题需要输入具体的方案
步骤如下
1. 使用map,存储第k个位置之前的字符串,所有的单词划分方案
2. 修剪分支,将一些不符合完全划分的单词除去
3. 遍历,获得所有符合条件的方案
public class Solution { public List<String> wordBreak(String s, Set<String> dict) { Map<Integer, List<Integer>> pMapALL = new HashMap<Integer, List<Integer>>(); boolean[] f = new boolean[s.length()]; for (int i = 0; i < s.length(); i++) { boolean flag = false; if (dict.contains(s.substring(0, i + 1))) { put(pMapALL, i, -1); flag = true; } for (int j = 0; j < i; j++) { if (f[j] && dict.contains(s.substring(j + 1, i + 1))) { put(pMapALL, i, j); flag = true; } } if (flag) { f[i] = true; } } if (f[s.length() - 1]) { Map<Integer, List<Integer>> pMap = new HashMap<Integer, List<Integer>>(); LinkedList<Integer> stack = new LinkedList<Integer>(); stack.push(s.length()-1); while (!stack.isEmpty()){ Integer node = stack.pop(); List<Integer> children = pMapALL.get(node); if(children != null){ pMap.put(node, children); for(Integer child : children){ stack.push(child); } } } List<String> results = new ArrayList<String>(); for(Integer key : pMap.keySet()){ List<Integer> children = pMap.get(key); if(children.contains(-1)){ print(pMap, -1, key, s, new LinkedList<String>(), results); } } return results; } return new ArrayList<String>(); } private void put(Map<Integer, List<Integer>> pMap, Integer key, Integer value) { if (pMap.get(key) == null) { pMap.put(key, new ArrayList<Integer>()); } pMap.get(key).add(value); } private void print(Map<Integer, List<Integer>> pMap, Integer startIndex, Integer endIndex, String s, LinkedList<String> stack, List<String> results) { String word = s.substring(startIndex+1, endIndex+1); stack.push(word); if(endIndex == s.length()-1){ StringBuilder words = new StringBuilder(); for(int i=stack.size()-1; i>=0; i--){ words.append(stack.get(i)); if(i != 0){ words.append(" "); } } results.add(words.toString()); return; } for(Integer key : pMap.keySet()){ List<Integer> children = pMap.get(key); for(Integer child : children){ if(child.equals(endIndex)){ print(pMap, child, key, s, stack, results); stack.pop(); } } } } }
相关推荐
5. Word Break II 单词断词II是一个变体的问题,要求将字符串断词为单词,并且可以使用动态规划或Trie树来解决该问题。 6. Word Ladder 单词梯是一个字符串问题,要求将一个单词转换为另一个单词,并且每次转换...
扩展矩阵leetcode Leetcode Leetcode Answer-Java 数组 11.乘最多水容器 ...wordBreak 279.完全平方数 numSquares 排序 56.合并区间 merge 75.颜色分类 sortColors 179.最大数 largestNumber 324.摆
* Word Break、Word Break II:该题目要求将字符串分割成单词,实现方法使用了动态规划和回溯算法。 * Word Ladder:该题目要求将一个单词转换成另一个单词,实现方法使用了广度优先搜索算法。 二、树和图 * ...
preorder-traversal链表reorder-list链表linked-list-cycle-ii链表linked-list-cycle动态规划word-break-ii动态规划word-break链表copy-list-with-random-pointer复杂度single-number-ii复杂度single-number动态规划
- **Word Break**:判断一个字符串是否可以拆分为一个词汇表中的单词序列。 7. **链表(Linked List)**: - **Linked List Cycle**:检测链表中的环。 - **Remove Duplicates from Sorted List**:从已排序的...