For example, given
s = "leetcode"
,
dict = ["leet", "code"]
.
Return true because "leetcode"
can be segmented as "leet code"
.
第一种解法:递归。
结果超时!!!
public boolean wordBreak(String s, Set<String> dict) { int length = s.length(); String sub = ""; for(int i = 1;i<length;i++){ sub = s.substring(0, i); if(dict.contains(sub)) { if(i == length) return true; else if(wordBreak(s.substring(i),dict)) return true; } } return false; }
设置布尔记忆数组dp[i]表示s.substring(0,i+1)是否可以按照字典分解
根据前面的dp[i]求解出所有的dp[i],最后输出dp[length-1]
public boolean wordBreak(String s, Set<String> dict) { int length = s.length(); boolean[] dp = new boolean[length]; for(int i = 0;i<length;i++){ dp[i] = isMatch(s.substring(0,i+1),dict); if(!dp[i]){//如果前i个子串不能匹配,则将它再次分割 for(int j = 0;j<i;j++){ if(dp[j] && isMatch(s.substring(j+1,i+1),dict)){//如果前j个子串可以分割,则看后面的字串是否匹配,只要有一种情况可以匹配,则表示可以分割,即刻跳出循环 dp[i]=true; break; } } } } return dp[length-1]; } public boolean isMatch(String sub, Set<String> dict){ if(dict.contains(sub)) return true; return false; }