https://oj.leetcode.com/problems/word-break-ii/
这个题目的大体意思是,有一个字符串和一个字典,通过匹配将字符串根据字典中的单词添加空格,从而成为一个句子。
我觉得如果没有给出使算法错误的测试数据的话,这个题是很难的,我第一次做这个题目的时候超时了,他给出的车是数据是
Last executed input: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", ["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"]
这个我觉得这个测试数据是很难想到的,针对这个测试数据,解决这一类的问题首先要确定,数据的字符串是否可以用字典中的单词来添加空格。
public void Recursion(StringBuffer s, int head,int tail,Set<String>dict,ArrayList<String> tempSet,List<String>resultSet){
String tempString = null;
for(int i=head+1;i<tail;i++){
tempString = s.substring(head,i);
if(dict.contains(tempString)){
ArrayList<String>tempset1 = new ArrayList<String>(tempSet);
tempset1.add(tempString);
Recursion(s, i, tail, dict, tempset1, resultSet);
}
}
tempString = s.substring(head,tail);
if(dict.contains(tempString)){
StringBuffer resultBuffer = new StringBuffer();
for (String string : tempSet) {
resultBuffer.append(string+" ");
}
resultBuffer.append(tempString);
resultSet.add(resultBuffer.toString());
}
}
public boolean Canequal(String s, Set<String>dict){
boolean[] a = new boolean[26];
boolean[] b = new boolean[26];
for(int i=0;i<26;i++){
a[i]=false;
b[i]=false;
}
for(int i=0;i<26;i++){
if(s.indexOf((char)(i+'a'))!=-1){
a[i]=true;
}
}
for(int i=0;i<26;i++){
for (String string : dict) {
if(string.indexOf(i+'a')!=-1){
b[i]=true;
break;
}
}
}
for(int i=0;i<26;i++){
if(a[i]==true&&b[i]==false){
return false;
}
}
return true;
}
public List<String> wordBreak(String s, Set<String> dict) {
if(!Canequal(s, dict)){
return new ArrayList<String>();
}
StringBuffer sBuffer = new StringBuffer(s);
ArrayList<String>tempSet = new ArrayList<>();
ArrayList<String>resultSet = new ArrayList<String>();
Recursion(sBuffer, 0, s.length() ,dict,tempSet,resultSet);
return resultSet;
}