给定一个字符串s和一组单词dict,判断s是否可以用空格分割成一个单词序列,使得单词序列中所有的单词都是dict中的单词(序列可以包含一个或多个单词)。

例如:给定s=“nowcode”;
dict=["now", "code"].
返回true,因为"nowcode"可以被分割成"now code".

试题链接 : CC12 拆分词句

说一下思路,这里我用的是动态规划.

  • 状态定义 :     F[n]     ---->  表示前n个字符否可以被找到
  • 状态方程 : F[n] = (F[0]&[1,n]) | (F[1]&[2,n]) ..... | (F[n-1]&[n,n])
  • 初始化 : F[0] = true

下面谈状态方程,很好理解 我们计算前n字符可以被抓到,只需要把原本这n个字符再次进行拆分,这样我们逻辑与上自己就可以了,也就是只要找到一个可以被分割就可以代表前n个字符可以被分割

class Solution
{
public:
  bool wordBreak(string s, unordered_set<string> &dict)
  {
    if (s.empty() || dict.empty())
      return true;
    std::vector<bool> dp;
    dp.resize(s.size() + 1, false);
    dp[0] = true; // 初始化
    for (size_t i = 1; i <= s.size(); i++)
    {
      for (int j = 0; j < i; j++)
      {
        // f(1) -> f(0) [1,1]
        // f2  -> f0  1-2   0  1
        string str = s.substr(j , i - j);
        auto iter = dict.find(str);
        if (dp[j] && iter != dict.end())
        {
          dp[i] = true;
          break;
        }
      }
    }

    return dp[s.size()];
  }
};

字符串切割_dp