单词切分(LintCode)

给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。

样例
给出

s = "lintcode"

dict = ["lint","code"]

返回 true 因为"lintcode"可以被空格切分成"lint code"

第一种DP算法,时间复杂度高

class Solution {
public:
    /**
     * @param s: A string s
     * @param dict: A dictionary of words dict
     */
    bool wordBreak(string s, unordered_set<string> &dict) {
        vector<bool> dp = vector<bool>(s.size()+1,false);
        dp[0] = true;
        for(int i = 1; i<s.size()+1;i++) {
            for(int j = 0; j < i;j++) {
                if(dp[j] == true && dict.count(s.substr(j,i-j))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};
  • 假设s(j,i)表示j到i的字符串
    第一种思路是dp[i]表示s(0,i)的字符串可以被空格分切成字典中的单词
    状态转移方程则为dp[i] = dp[j] && (s(j,i)是否存在字典中)
  • 第二种DP优化思路是算出字典中长度最长的字符串,i-j的长度不可能超过最大长度

第二种DP优化算法,时间复杂度稍微优化

class Solution {
public:
    /**
     * @param s: A string s
     * @param dict: A dictionary of words dict
     */
    bool wordBreak(string s, unordered_set<string> &dict) {
        vector<bool> dp = vector<bool>(s.size()+1,false);
        int maxL = getMaxLength(dict);
        dp[0] = true;
        for(int i = 1; i<s.size()+1;i++) {
            for(int j = i; j >= 1 && j >= (i-maxL);j--) {
                if(dp[j-1] == true && dict.count(s.substr(j-1,i-j+1))) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }

    int getMaxLength(unordered_set<string> &dict) {
        int maxLength = 0;
        for (unordered_set<string>::iterator it = dict.begin(); it != dict.end(); ++it) { 
            maxLength = maxLength > (*it).length() ? maxLength : (*it).length();
        }
        return maxLength;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • 分治方法 将问题划分成互不相交的子问题 递归地求解子问题 将子问题的解组合起来 动态规划(两个要素:最优子结构、子...
    superlj666阅读 3,483评论 0 0
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 11,533评论 1 42
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 8,806评论 0 18
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,827评论 0 17