Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.
For example, given
s = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet code"
.
https://oj.leetcode.com/problems/word-break/
思路1:DFS。
思路2:DP。dp[i]表示前i长度字符串能否成功分解。
public class Solution { public boolean wordBreak(String s, Set<String> dict) { return wordBreakDP(s, dict); } private boolean wordBreakHelper(String s, Set<String> dict, int start) { if (start == s.length()) return true; for (String each : dict) { int len = each.length(); if (start + len > s.length()) continue; if (s.substring(start, start + len).equals(each)) { if (wordBreakHelper(s, dict, start + len)) return true; } } return false; } private boolean wordBreakDP(String s, Set<String> dict) { int len = s.length(); boolean[] dp = new boolean[len + 1]; dp[0] = true; for (int i = 0; i < len; i++) { if (dp[i] == false) continue; for (String each : dict) { int end = i + each.length(); if (end > len) continue; if (dp[end] == true) continue; if (s.substring(i, end).equals(each)) dp[end] = true; } } return dp[len]; } public static void main(String[] args) { String s = "abcd"; String[] a = { "a", "abc", "b", "cd" }; Set<String> dict = new HashSet<String>(); for (String each : a) dict.add(each); System.out.println(new Solution().wordBreak(s, dict)); } }
第二次记录:
dfs法果断超时
public class Solution { public boolean wordBreak(String s, Set<String> dict) { return wordBreakHelper(s, dict, 0); } private boolean wordBreakHelper(String s, Set<String> dict, int start) { if (start == s.length()) return true; for (String each : dict) { int len = each.length(); if (s.substring(start).startsWith(each)) { if (wordBreakHelper(s, dict, start + len)) return true; } } return false; } }
dp法,学会用String的startsWith方法。
public class Solution { public boolean wordBreak(String s, Set<String> dict) { return wordBreakDP(s, dict); } private boolean wordBreakDP(String s, Set<String> dict){ int n= s.length(); boolean[] dp = new boolean[n+1]; dp[0]=true; for(int i=0;i<=n;i++){ if(dp[i]==false) continue; for(String each:dict){ if(s.substring(i).startsWith(each)){ dp[i+each.length()]=true; } } } return dp[n]; } }
第三遍:
dfs的方法换了一种,不过依然超时。
DP的方法竟然不记得了,看了思路实现起来就简单多了。
import java.util.HashSet; import java.util.Set; public class Solution { public boolean wordBreak(String s, Set<String> dict) { return wordBreakDP(s, dict); } private boolean wordBreakDfs(String s, Set<String> dict) { if ("".equals(s)) return true; for (int i = 1; i <= s.length(); i++) { String left = s.substring(0, i); if (dict.contains(left)) { if (wordBreakDfs(s.substring(i, s.length()), dict)) return true; } } return false; } private boolean wordBreakDP(String s, Set<String> dict) { int n = s.length(); boolean[] dp = new boolean[n + 1]; dp[0] = true; for (int i = 0; i < n; i++) { if (dp[i] == false) continue; String tmp = s.substring(i); for (String each : dict) { if (tmp.startsWith(each)) { dp[i + each.length()] = true; } } } return dp[n]; } public static void main(String[] args) { String s = "leetcode"; String[] a = { "leet", "code", "", "cd" }; Set<String> dict = new HashSet<String>(); for (String each : a) dict.add(each); System.out.println(new Solution().wordBreak(s, dict)); } }
参考:
http://www.programcreek.com/2012/12/leetcode-solution-word-break/