zoukankan      html  css  js  c++  java
  • [leetcode-139-Word Break]

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words,
    determine if s can be segmented into a space-separated sequence of one or more dictionary words.
    You may assume the dictionary does not contain duplicate words.

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

    Return true because "leetcode" can be segmented as "leet code".

    参考思路:

    bool wordInDict(string s,vector<string>& wordDict)
        {
            if (s == "")return true;
            vector<string>::iterator it;
            for (it = wordDict.begin(); it != wordDict.end();it++)
                if (*it == s)    return true;        
         return false;
        }
        bool wordBreak(string s, vector<string>& wordDict)
        {
            vector<bool> flag(s.size(),false);//从某位置开始,是否能分词
            return wordBreak(s, wordDict, 0, flag);
        }
        bool wordBreak(string s, vector<string>& wordDict,int index,vector<bool>& flag)
        {
            if (flag[index]) return false;
            
            int len = s.size() - index;
            for (int i = len; i > 0;i--)
            {
                string word = s.substr(index, i);
                if (wordInDict(word,wordDict))
                {
                    if (i == len) return true;
                    elseif (wordBreak(s, wordDict, index+i, flag)) return true;                
                }
            }
            flag[index] = true;
            return false;
        }

     学习了LeetCode上牛人写的动态规划版本。

    bool wordBreak(string s, unordered_set<string> &dict) {
            if(dict.size()==0) return false;
            
            vector<bool> dp(s.size()+1,false);
            dp[0]=true;
            
            for(int i=1;i<=s.size();i++)
            {
                for(int j=i-1;j>=0;j--)
                {
                    if(dp[j])
                    {
                        string word = s.substr(j,i-j);
                        if(dict.find(word)!= dict.end())
                        {
                            dp[i]=true;
                            break; //next i
                        }
                    }
                }
            }
            
            return dp[s.size()];
        }

    参考

    http://www.jianshu.com/p/f30581e8d343

    https://discuss.leetcode.com/topic/7299/c-dynamic-programming-simple-and-fast-solution-4ms-with-optimization

  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/hellowooorld/p/6474169.html
Copyright © 2011-2022 走看看