Leetcode-139. Word Break

来源:互联网 发布:上海雅居乐万豪java 编辑:程序博客网 时间:2024/06/05 15:14

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发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;    }}





0 0
原创粉丝点击