【LeetCode】Word Break 单词拆分

题目

Word Break

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”.

题目大意

给定一个字符串s,一个字符串字典,判断s能不能拆分成几个单词,这几个单词都在字典中。

思路

动态规划的思路。
将问题拆分成更小的子问题。用dp[i]表示0到i的子字符串是否可以拆分成满足条件的单词,在计算dp[i]的时候,我们已经知道dp[0],dp[1],…,dp[i-1],如果以i为结尾的j~i子串是满足条件的,并且0~j的子串也是在字典中的,那么dp[i]就是true。
用公式表示就是:

res[j]&&s.substring[j,i+1]dict

这里参考了这个解题思路: http://blog.csdn.net/linhuanmars/article/details/22358863

还有一些其他的思路,比如正则表达式等,可以参考:
http://www.programcreek.com/2012/12/leetcode-solution-word-break/

总的来说用动态规划最适合。

解答

    public boolean wordBreak(String s, Set<String> wordDict) {
        if(s==null || s.length() == 0){
            return false;
        }
        boolean[] res = new boolean[s.length()+1];
        res[0] = true;
        for(int i=0;i<s.length();i++){
            StringBuilder str = new StringBuilder(s.substring(0, i+1));
            for(int j=0;j<=i;j++){
                if(res[j] && wordDict.contains(str.toString())){
                    res[i+1] = true; 
                    break;
                }
                str.deleteCharAt(0);
            }
        }

        return res[s.length()];
    }
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页