【DP】 wordbreak2 仿照神的代码

还是看代码有效果,刷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);
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值