还是看代码有效果,刷LeetCode刷到62了,往前一看发现做过的题都没什么印象。感觉自己到了瓶颈期了,再一味门头刷题已经没有什么进步空间了,因此开始看看别人的代码,所以有了上一篇神代码和渣代码的比较。2是仿照神代码的实现,果然干净整洁了很多。而且一次过所有点。
基本就是在1的基础上做了一个direct指向直接后继节点,然后用dfs遍历一下结果
ArrayList<String> res=new ArrayList<String>();
//dirct[i][j]==1 means s[i]can directly goto s[j];
//though direct is a large table we only concern about the point from the start
int[][] direct;
//allow[i] means i can go to the end;
boolean[] allow;
boolean[] cango;
String bases;
public ArrayList<String> wordBreak(String s, Set<String> dict) {
bases=s;
direct=new int[s.length()+1][s.length()+1];
// System.out.println(direct.length+" "+direct[0].length);
allow=new boolean[s.length()+1];
cango=new boolean[s.length()+1];
for(int i=0;i<s.length();i++){
allow[i]=false;
cango[i]=false;
}
cango[0]=true;
//fill the direct by the help of cango
for(int i=0;i<s.length();i++){
if(!cango[i])
continue;
for(String ts:dict){
int len=ts.length();
if(i+len>bases.length())
continue;
if(bases.substring(i, i+len).equals(ts)){
direct[i][i+len]=1;
cango[i+len]=true;
if(i+len==s.length())
allow[i]=true;
}
}
}
// System.out.println("finding finish");
//find all allow as a head of a dfs to list all the possible result
for(int i=0;i<s.length();i++)
if(allow[i])
genRes(i,bases.substring(i,bases.length()));
return res;
}
private void genRes(int k,String s) {
if(k==0){
res.add(s);
return;
}
for(int i=0;i<k;i++){
if(direct[i][k]==1)
genRes(i,bases.substring(i,k)+" "+s);
}
}
是不是干净整了很多啊 哈哈哈
code rewrite
int len;
String ss;
Set<String> dictset;
HashMap<Integer,ArrayList<String>> mem=new HashMap<Integer,ArrayList<String>>();
public ArrayList<String> dp(int i) {
if(mem.get(i)!=null)
return mem.get(i);
ArrayList<String> returnlist=new ArrayList<String>();
if(i==len){
returnlist.add("");
return returnlist;
}
String subs=ss.substring(i,len);
for(String ts:dictset)
if(subs.startsWith(ts)){
ArrayList<String> tlist=dp(i+ts.length());
for(String tts:tlist){
if(tts.length()==0)
returnlist.add(ts);
else
returnlist.add(ts+" "+tts.trim());
}
}
mem.put(i, returnlist);
return returnlist;
}
public ArrayList<String> wordBreak(String s, Set<String> dict) {
ss = s;
dictset = dict;
len = s.length();
return dp(0);
}