Word Break

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

第一种解法:递归。

结果超时!!!

public boolean wordBreak(String s, Set<String> dict) {
        int length = s.length();
		 String sub = "";
		 for(int i = 1;i<length;i++){
			 sub = s.substring(0, i);		
			 if(dict.contains(sub)) {
			     if(i == length) return true;
			     else if(wordBreak(s.substring(i),dict)) return true;
			 }
		 }
	     return false;
    }

第二种解法:动态规划。

设置布尔记忆数组dp[i]表示s.substring(0,i+1)是否可以按照字典分解

根据前面的dp[i]求解出所有的dp[i],最后输出dp[length-1]

    public boolean wordBreak(String s, Set<String> dict) {
        int length = s.length();
		boolean[] dp = new boolean[length];
		for(int i = 0;i<length;i++){
			 dp[i] = isMatch(s.substring(0,i+1),dict);
			 if(!dp[i]){//如果前i个子串不能匹配,则将它再次分割
			 	for(int j = 0;j<i;j++){
			 		if(dp[j] && isMatch(s.substring(j+1,i+1),dict)){//如果前j个子串可以分割,则看后面的字串是否匹配,只要有一种情况可以匹配,则表示可以分割,即刻跳出循环
			 		    dp[i]=true;
			 		    break;
			 		}
			 	}
			 }
		 }
	    return dp[length-1];
    }
    public boolean isMatch(String sub, Set<String> dict){
    	if(dict.contains(sub)) return true;
    	return false;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值