【DP】 wordbreak2 仿照神的代码

来源:互联网 发布:财报数据下载网站 编辑:程序博客网 时间:2024/06/05 18:18

还是看代码有效果,刷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 startint[][] 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 cangofor(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 resultfor(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);elsereturnlist.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);    }



0 0
原创粉丝点击