您的位置:首页 > 其它

[leetcode] Word Break

2014-07-07 01:12 274 查看
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
;
}

}


第三遍:

  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
;

}

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/

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