LeetCode Word Break II
来源:互联网 发布:西部数据wd mac格式化 编辑:程序博客网 时间:2024/06/03 20:33
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.
Return all such possible sentences.
For example, given
s = “catsanddog”,
dict = [“cat”, “cats”, “and”, “sand”, “dog”].
A solution is [“cats and dog”, “cat sand dog”].
思路分析:这题可以用DFS 搜索递归做,基本是brute force的解法,dfs函数要维护的量包括startIndex,preWords和res,startIndex表示当前进行word break的起点,也就是说前面如果已经被break了,应该排除在外。preWords主要维护目前已经breaked的string前面的部分,后面从startIndex一旦发现新的word可以添加到preWords之后,dfs返回的条件是当startIndex已经越界,也就是>=s.length()了,就把当前得到的word break方案加入res。从题目的实例我们也可以看出,同一个字符串可以有多个word break方案,因此我们从前向后scan 字符串发现第一个可以break的词的时候需要更新preWords进行dfs递归调用。这题是NP问题,时间复杂度为O(2^n)也就是指数级别。 这类DFS递归搜索的题目有很多,除了word break,还有八皇后,Sudoku Solver等等,都是这类题目,在面试中很常见,要多加练习。
AC Code:以下是brute force DFS搜索AC的从code。由于LeetCode有一个很长的不能break的测试用例,因此把word break I 判断能否break的函数作为sub routine,先判断一下能否break,如果不能直接返回空容器。
public class Solution { public List<String> wordBreak(String s, Set<String> dict) { ArrayList<String> res = new ArrayList<String>(); if(s == null || s.isEmpty() || !wordBreakCanDo(s, dict)){ return res; } dfs(s, dict, 0, "", res); return res; } //10:08 public void dfs(String s, Set<String> dict, int startIndex, String preWords, ArrayList<String> res){ if(startIndex >= s.length()){ //return contition is that the startIndex has been out of bound res.add(preWords); return; } for(int i = startIndex; i < s.length(); i++){ String curStr = s.substring(startIndex, i+1); if(dict.contains(curStr)){ String newSol; if(preWords.length() > 0){ newSol = preWords + " " + curStr; } else { newSol = curStr; } dfs(s, dict, i + 1, newSol, res); } } } //1021 public boolean wordBreakCanDo(String s, Set<String> dict) { s = "#" + s; boolean[] canSegmented = new boolean[s.length()]; canSegmented[0] = true; for(int i = 1; i < s.length(); i++){ for(int k = 0; k < i; k++){ canSegmented[i] = canSegmented[k] && dict.contains(s.substring(k + 1, i + 1)); if(canSegmented[i]) break; } } return canSegmented[s.length() - 1]; }}
- [leetcode]Word Break II
- LeetCode:Word Break II
- Leetcode: Word Break II
- [LeetCode] Word Break II
- [LeetCode]Word Break II
- LeetCode | Word Break II
- [LeetCode] - Word Break II
- LeetCode - Word Break II
- Leetcode Word Break II
- [LeetCode] Word Break II
- Word Break II -- LeetCode
- LeetCode (Word Break II )
- Leetcode--Word Break II
- Leetcode: Word Break II
- LeetCode Word Break II
- Word Break II leetcode
- [leetcode]Word Break II
- leetcode -- word break II
- Android studio 启动时出现Android studio was unable to create a local connection in order
- PHP扩展开发探索(一)
- HTML5 meta标签属性
- Selenium各种工具比较
- Balance( POJ1837)
- LeetCode Word Break II
- 7 shell命令之cut
- Hibernate学习总结
- Guava RateLimiter在Web应用中的使用
- 黑马程序员——正则表达式
- 【OpenCV归纳】3 在实例中学习简单函数以及数据读写
- 【OpenCV归纳】4 关于HighGUI
- 少女漫「不思议游戏」新作
- 解决在虚拟机里无法装ghost系统的问题的方法