139 Word Break
2017-02-16 04:22
323 查看
这道题是一道很不错的DP方法的示范例题。。。逻辑很清楚,通过一个多一个长度的数组,来记录每一个对应字母是否可以搭桥过去。 关键!!用对应数组来记录是否能够break成功。
代码如下:
今天的代码如下,现在这道题基本捻熟于心了。。。
刚刚刷邮件,得到一个好消息,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; // 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]; } }
相关文章推荐
- 139. Word Break
- leetcode 139 —— Word Break
- leetcode 139. Word Break
- LeetCode 139. Word Break(单词分隔)
- leetcode 139. Word Break(dp,字典匹配)
- 139. Word Break
- Leetcode题解 - 139. Word Break
- 第十一周:[Leetcode]139. Word Break
- Leetcode--139. Word Break
- [LeetCode] 139 Word Break(BFS统计层数的方法)
- Leetcode 139. Word Break
- LeetCode139:Word Break
- [Leetcode 139, medium] Word Break
- [leetcode-139]Word Break(java)
- 139. Word Break (String; DP)
- 139 Word Break
- [LeetCode]139. Word Break
- Medium 139题 Word Break
- 139. Word Break
- LeetCode-139. Word Break (JAVA)单词切分