您的位置:首页 > 编程语言 > Java开发

Leetcode-139. Word Break

2016-10-27 13:55 417 查看
前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

——————————————————————————————

Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

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

Return true because 
"leetcode"
 can be segmented as 
"leet
code"
.
这个题目提醒了我,我一开始用Set只保存了对的字符串,结果超时了,我看了别人的解法是保存错的字符串。。想了想确实,因为错的比对的情况多很多。Your runtime beats 5.13% of java
submissions
public class Solution {
private Set<String> invalidStr = new HashSet<String>();
public boolean wordBreak(String s, Set<String> wordDict) {

boolean flag = false;

if(wordDict.contains(s)) return true;
if(invalidStr.contains(s)) return false;

for(int i = 1; i < s.length(); i ++){
String subString = s.substring(0,i);
if(wordDict.contains(subString)) flag = wordBreak(s.substring(i,s.length()),wordDict);
if(!flag)invalidStr.add(s);
else break;
}
return flag;
}
}

后来我想了想,我也可以把对的保存了。。不过我这样还是有点麻烦,看了下dp的思路,其实我这个也算是dp,用一个dp的array保存哪些位置是true确实更好一些。。Your runtime beats
16.34% of java submissions.
public class Solution {
private Set<String> invalidStr = new HashSet<String>();
private Set<String> validStr = new HashSet<String>();
public boolean wordBreak(String s, Set<String> wordDict) {

boolean flag = false;

if(wordDict.contains(s) || validStr.contains(s)) return true;
if(invalidStr.contains(s)) return false;

for(int i = 1; i < s.length(); i ++){
String subString = s.substring(0,i);
if(wordDict.contains(subString)) flag = wordBreak(s.substring(i,s.length()),wordDict);
if(!flag)invalidStr.add(s);
else{validStr.add(s); break;}
}
return flag;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode 算法