题目
给定一个字符串和一个字典,在字符串中添加空格来构造一个句子,使句子中的每个单词在字典中都存在;
输入 :字符串
输出:所有可能的句子
例如:
s=”catsanddog”
dict=[“cat”,”cats”,”and’,”sand”,”dog”]
输出:cats and dog和cat sand dog
分析
将字符串分割成2部分s1和s2,如果s1包含在字典中,则递归计算s2;然后合并s1和s2分割的结果;
s2可能无法分割,则返回一个”“;
动态规划方法:
状态转移方程:
* f(i) 表示s[0,i]是否可以分词
* f(i) = f(j) && f(j+1,i); 0 <= j < i;
实现
/*give a string s and a dictonary of words dict,
* determine if s can be segmented into a space-separated sequence of
* one or more dictonary words.
*
* sucha as:
* s=leetcode
* dict=[leet,code]
* return true
*/
public static boolean wordBreak(String s, Set<String> dict) {
if(s==null || s.equals("")||dict.isEmpty()||dict==null){
return false;
}
boolean[] dp=new boolean[s.length()+1];
dp[0]=true;
for(int i=0;i<=s.length();i++){
for(int j=i-1;j>=0;j--){
if(dp[j]&&dict.contains(s.substring(j, i))){
dp[i]=true;
break;
}
}
}
return dp[s.length()];
}
private static ArrayList<String> wordBreak_2(String s,Set<String> dict) {
ArrayList<String> list=new ArrayList<String>();
if(s.length()==0){
list.add("");
return list;
}
for(int i=1;i<=s.length();i++){
String sub=s.substring(0, i);
if(dict.contains(sub)){
ArrayList<String> t=wordBreak_2(s.substring(i),dict);
if(t.size()==0){
continue;
}else{
for (int j = 0; j < t.size(); j++) {
StringBuilder sb = new StringBuilder();
sb.append(sub).append(" ").append(t.get(j));
list.add(sb.toString().trim());
}
}
}
}
return list;
}
上述递归实现===超时
加入map,记录字符串对应的结果
private static ArrayList<String> wordBreak_2(String s,Set<String> dict,HashMap<String,List<String>> map) {
if(map.containsKey(s)){
return (ArrayList<String>) map.get(s);
}
ArrayList<String> list=new ArrayList<String>();
if(s.length()==0){
list.add("");
return list;
}
for(int i=1;i<=s.length();i++){
String sub=s.substring(0, i);
if(dict.contains(sub)){
ArrayList<String> t=wordBreak_2(s.substring(i),dict,map);
if(t.size()==0){
continue;
}else{
for (int j = 0; j < t.size(); j++) {
StringBuilder sb = new StringBuilder();
sb.append(sub).append(" ").append(t.get(j));
list.add(sb.toString().trim());
}
}
}
}
map.put(s, list);
return list;
}