您的位置:首页 > 其它

140. Word Break II

2016-12-13 01:16 253 查看
看起来像backtrack。。

实际上也就是。

有一个TEST CASE令我们必须先判断String是不是可分的,从而导致我不得不把word break I的办法拿来用,正好复习下。。

public class Solution {
public List<String> wordBreak(String s, Set<String> wordDict) {
List<String> res = new ArrayList<String>();
if (s.length() == 0) return res;

if (!isBreakable(s, wordDict)) return res;

helper(s, wordDict, new String(), res);
return res;

}

public void helper(String s, Set<String> wordDict, String tempStr, List<String> res) {
if (s.length() == 0) {
res.add(new String(tempStr.trim()));
return;
} else {
for (int i = 1; i <= s.length(); i++) {
if (wordDict.contains(s.substring(0,i)) && isBreakable(s.substring(i), wordDict)) {
helper(s.substring(i), wordDict, tempStr + " " + s.substring(0,i), res);
}
}
return;
}
}

public boolean isBreakable(String s, Set<String> wordDict) {
if (s.length() == 0) return true;
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
for (int i = 0; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && wordDict.contains(s.substring(j,i))) {
dp[i] = true;
break;
}
}
}

return dp[s.length()];
}
}

这两天在准备面经,没怎么刷题。。

明天面试啦。。加油哇。。保佑出个我做过的题吧。。。

哇呀呀~ 我 生 气 啦~~



二刷。

backtrack暴力搜索= =

一个String能拆得是这样。。

0-i的左边得是一个单词,i-n的右边得能拆= = 能拆i-n继续下一层.

能不能拆的判断需要139的解法。

Time:

能不能拆算是O(2^n) 后面得这样算。。

T(n) = T(n-1) + T(n-2) + ... + T(0)

T(n-1) = T(n-2) + T(n-3) + ... + T(0)

T(n) = 2T(n-1) = 4T(n-2) ... (2^n)T(1)

T(1) = O(2^n)..so

so..Time compexity : O(2^n)?

139我可以确定是O(2^n),这个肯定比那个大= =

public class Solution {
public List<String> wordBreak(String s, Set<String> wordDict) {
List<String> res = new ArrayList<>();

if (!isBreakable(s, wordDict)) {
return res;
}

dfs(res, s, wordDict, new StringBuilder());

return res;
}

public void dfs(List<String> res, String s, Set<String> set, StringBuilder sb) {
if (s.length() == 0) {
res.add(sb.toString().trim());
return;
} else {
int len = sb.length();
for (int i = 1; i <= s.length(); i++) {
if (set.contains(s.substring(0,i)) && isBreakable(s.substring(i), set)) {
sb.append(s.substring(0, i) + " ");
dfs(res, s.substring(i), set, sb);
sb.setLength(len);
}
}
}
}

public boolean isBreakable(String s, Set<String> set) {
if (s.length() == 0) return true;

boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;

for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
if (dp[j] && set.contains(s.substring(j, i))) {
dp[i] = true;
break;
}
}
}

return dp[s.length()];
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: