Word Break: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"
.
动态规划思想:dp[i] 表示前面i 个字符能分割,dp[ j ] 满足分割的条件是存在k 使得 dp [k] && substring[k,j]在字典里。特别注意下标的处理。
public boolean wordCanbreak(String s, Set<String> dict) {
int len = s.length();
boolean [] dp = new boolean[len+1];
dp[0] = true;
for(int i =1 ;i<=len;i++){
if(dp[i-1]){
int index = i-1;
for(int j=index;j<len;j++){
// 注意substring方法长度范围
String str = s.substring(index, j+1);
if(dict.contains(str)){
dp[j+1] = true;
}
}
}
}
return dp[len];
}
Word Break ||
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"]
.
就是要返回所有可能的分割, 做分割就是用回溯,但是不剪枝肯定要超时。这里剪枝利用前面那里得到的如果可以分割我再进行回溯,这样才能避免超时,因为测试案例中有一个极端例子不进行剪枝肯定超时。
public List<String> wordBreak(String s, Set<String> dict) {
ArrayList<String> res = new ArrayList<String>();
if (s == null || s.length() == 0)
return res;
if(wordCanbreak(s, dict)){
helper(s, dict, 0, "", res);
return res;
}
else
return res;
}
private void helper(String s, Set<String> dict, int start, String item,
ArrayList<String> res) {
if (start >= s.length()) {
res.add(item);
return;
}
StringBuilder str = new StringBuilder();
for (int i = start; i < s.length(); i++) {
str.append(s.charAt(i));
if (dict.contains(str.toString())) {
String newItem = item.length() > 0 ? (item + " " + str
.toString()) : str.toString();
helper(s, dict, i + 1, newItem, res);
}
}
}
public boolean wordCanbreak(String s, Set<String> dict) {
int len = s.length();
boolean [] dp = new boolean[len+1];
dp[0] = true;
for(int i =1 ;i<=len;i++){
if(dp[i-1]){
int index = i-1;
for(int j=index;j<len;j++){
// 注意substring方法长度范围
String str = s.substring(index, j+1);
if(dict.contains(str)){
dp[j+1] = true;
}
}
}
}
return dp[len];
}