139 Word Break

这道题是一道很不错的DP方法的示范例题。。。逻辑很清楚,通过一个多一个长度的数组,来记录每一个对应字母是否可以搭桥过去。 关键!!用对应数组来记录是否能够break成功。

代码如下:

public class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int len=s.length();
        if(len==0) return true; // dependent on how the question really means;
        boolean[] record= new boolean[len+1]; // 思路:跟面试官从这里解释:用一个数组来存储对应位置上,是否可以跨越,就像是不断搭桥跨过这个单词。。。
        record[0] = true;
        for(int i=1; i<len+1; i++){  // i是record中的index,代表桥的终点,所以用record的长度len+1,
            for(int j=0; j<i; j++){  // j是桥的前半段的终点,后半段的起点,每次都是从0开始,下小于终点i
                if(record[j]==false) continue; // 如果前半段都到不了,那就肯定不行
                if(record[j]==true && wordDict.contains(s.substring(j,i))){  // !!! remember how to call the function list.contains(...);
                    record[i]= true;   // 只要当前半段true,且后半段也true,才能把当前位置设置成true。。
                    break;  // 只要有一中情况使得该index为true,那就可是true了。。
                }
            }
        }
        return record[len]; // 返回最后单词结尾处对应字母的 record中的值。。
    }
}

// 分析下过程,还是蛮好玩的。。。record[i] 记录的是string中,前i个letter是否可以被跨越。。。有len个字母,那就要有record[len]存在,所以要allocate一个len+1大小的数组。。。
// 第一个位置放什么呢?要考虑特殊例子,就是当第一个被设定为true的位置,一定是因为从头到该位置的substring,在wordDict里存在。。不可能是跨越产生的true,而设定成true的唯一条件是: if(record[j] && wordDict.contains(s.substring(i,j))) , 这就决定了,record[0] 为true。。。
// 此题和 jump game,内涵上有点像。。。 形式上和 binary tree个数拿到题目有点像,相似点:生成了一个len+1 大小的数组。。。

// 代码是一遍bug-free的。。。在纸上画清楚了,然后还检查了1遍。。。现在要追求的就是一遍bug-free

今天的代码如下,现在这道题基本捻熟于心了。。。

刚刚刷邮件,得到一个好消息,UBER通知面试了,哈哈,真是一剂强心针啊。。。本来现在压力山大,明天Google生死战,FB一面虽然自我感觉还不错但毕竟没有达到最优,HR出差一周,只有自动回复迟迟不回邮件,我基本把明天Google的面试当作整个面试最后一战了。。。现在来了UBER好歹让我又可以缓一缓了,至少是第一个加hot startup,加油!!

public class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int len=s.length();
        if(len==0) return true;
        boolean[] track= new boolean[len+1]; // 要明确知道这个+1的含义了:1, index的位置就代表了s里面第几个字母是否能成, 那么第0个位置就自动设置成true,2,正因为比index要大1,那么在使用substring()的时候就非常方便了,直接用了,见下方
        track[0]=true;
        for(int i=1; i<len+1; i++){   // i就代表了s中第i个字母是否可以break,同时i比index大1,就等于是在locate在i个字母的index的后方,在使用substring()的时候,就等于是尾巴index,直接写s.substring(j, i); 就可以了
            for(int j=0; j<i; j++){
                if(track[j]==false) continue;
                if(track[j]==true && wordDict.contains(s.substring(j, i))){
                    track[i]=true;
                    break;
                }
            }
        }
        return track[len];
    }
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值