单词切分(LintCode)

作者: 杰米 | 来源:发表于2016-08-17 01:55 被阅读366次

给出一个字符串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;
    }
};

相关文章

  • LintCode 单词切分

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

  • 单词切分(LintCode)

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

  • lintcode-单词切分

    C++版 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。动态规划的本质...

  • Tyger单词发音、切分

    香蕉测试ba-na-na1-2-3,你猜对了吗?

  • 新概念第五次课---摸清代词的门道

    一。 开篇章节:语法词尾单词的切分发音,先把词尾()起来,再切分音节。 语法词尾常见的有:-s, -es, -ed...

  • 搜索笔记 ---- 1

    分词 完全切分 完全切分指的是,找出一段文本中的所有单词。 商品和服务 - > 商 商品 品 和 和服 服 服务 ...

  • OJ lintcode 最长单词

    给一个词典,找出其中所有最长的单词。您在真实的面试中是否遇到过这个题?Yes样例在词典{"dog","google...

  • 58、索引管理_修改分词器以及定制自己的分词器

    1、默认的分词器 standardstandard tokenizer:以单词边界进行切分standard tok...

  • 999 - Elasticsearch Analysis 03

    Word Oriented Tokenizers 下面的tokenizer主要用来切分文本为单个单词。 Stand...

  • 使用Python将文本按标点整句切分

    利用分词工具包例如jieba可以轻易的将句子切分为不同的单词,但是当你有切分整句的需求时,该怎么解决呢? 将段落按...

网友评论

    本文标题:单词切分(LintCode)

    本文链接:https://www.haomeiwen.com/subject/trfmsttx.html