zoukankan      html  css  js  c++  java
  • [Leetcode] 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".

    动规实在是太强大了!注意在枚举子串长度时,只要枚举从dict字典中最短单词到最长单词的长度就可以了。

     1 class Solution {
     2 public:
     3     /**
     4      * @param s: A string s
     5      * @param dict: A dictionary of words dict
     6      */
     7     bool wordBreak(string s, unordered_set<string> &dict) {
     8         // write your code here
     9         vector<bool> dp(s.length() + 1, false);
    10         dp[0] = true;
    11         int min_len = INT_MAX, max_len = INT_MIN;
    12         for (auto &ss : dict) {
    13             min_len = min(min_len, (int)ss.length());
    14             max_len = max(max_len, (int)ss.length());
    15         }
    16         for (int i = 0; i < s.length(); ++i) if(dp[i]) {
    17             for (int len = min_len; i + len <= s.length() && len <= max_len; ++len) {
    18                 if (dict.find(s.substr(i, len)) != dict.end()) 
    19                     dp[i + len] = true;
    20             }
    21             if (dp[s.length()]) return true;
    22         }
    23         return dp[s.length()];
    24     }
    25 };

    再看个非动规的版本:

     1 class Solution {
     2 public:
     3   bool wordBreakHelper(string s,unordered_set<string> &dict,set<string> &unmatched,int mn,int mx) {  
     4         if(s.size() < 1) return true;  
     5         int i = mx < s.length() ? mx : s.length();  
     6         for(; i >= mn ; i--)  
     7         {  
     8             string preffixstr = s.substr(0,i);  
     9             if(dict.find(preffixstr) != dict.end()){  
    10                 string suffixstr = s.substr(i);  
    11                 if(unmatched.find(suffixstr) != unmatched.end())  
    12                     continue;  
    13                 else  
    14                     if(wordBreakHelper(suffixstr, dict, unmatched,mn,mx))  
    15                         return true;  
    16                     else  
    17                         unmatched.insert(suffixstr);  
    18             }  
    19         }  
    20         return false;  
    21     }  
    22     bool wordBreak(string s, unordered_set<string> &dict) {  
    23         // Note: The Solution object is instantiated only once.  
    24         if(s.length() < 1) return true;  
    25         if(dict.empty()) return false;  
    26         unordered_set<string>::iterator it = dict.begin();  
    27         int maxlen=(*it).length(), minlen=(*it).length();  
    28         for(it++; it != dict.end(); it++)  
    29             if((*it).length() > maxlen)  
    30                 maxlen = (*it).length();  
    31             else if((*it).length() < minlen)  
    32                 minlen = (*it).length();  
    33         set<string> unmatched;  
    34         return wordBreakHelper(s,dict,unmatched,minlen,maxlen);  
    35     }
    36 };
  • 相关阅读:
    jqGrid 各种参数 详解
    JqGrid自定义(图片)列
    win10以前连接过的wifi密码怎么查看
    C# 文件操作常用方法总结
    js LocalStorage
    list互转datatable 支持Nullable转换
    UVA 515 King
    UVA 558 Wormholes
    UVA 10986 Sending email 最短路问题
    UVA 10801 Lift Hopping 最短路
  • 原文地址:https://www.cnblogs.com/easonliu/p/3654123.html
Copyright © 2011-2022 走看看