天天刷leetcode(3) ---- 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.

Note:

  1. The same word in the dictionary may be reused multiple times in the segmentation.
  2. You may assume the dictionary does not contain duplicate words.

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

  1. 拆分时可以重复使用字典中的单词。
  2. 你可以假设字典中没有重复的单词。

思路

天天刷leetcode(3) ---- 139.Word Break_第1张图片
如图,分为两条序列,s为给定的字符串,f为判断字符串中分割出的字母是否在字典中的标志。如图,当f到达j位置时,我们只需要判断[j+1…i]这段子字符串是否在字典中即可。

整体思路整理下来就是,利用f序列,跳过已经分割好的子字符串,判断当前标记到字符串末尾的内容是否在字典中即可。

有一种情况是整个字符串s即为字典中的内容。因此,在s字符串前加一段空字符,作为f的第一个标记。
代码如下

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> dict(wordDict.cbegin(), wordDict.cend()); //将vector形式转换为字典型,提高检索效率
        int n = s.length();
        s = " " + s;  // s[1...n]
        vector<int> f(n+1, 0);
        f[0] = 1;

        for(int i=1;i<=n;++i)
            for(int j=0;j<i;++j){
                if(f[j] == 1){
                    const string new_s = s.substr(j+1, i-j); // s[j+1...i]
                    if(dict.count(new_s)){
                        f[i] = 1;
                        break;
                    }
                }
            }
        return f[n];
    }
};

你可能感兴趣的:(leetcode,算法,c++)