题目:单词拆分

1. 确定状态:dp[ i ] 代表前 i 个字符组成的字符串是否能够被拆分
2. 状态转移:dp[ i ] = (**dp[ j ]** && **s.substr(j, i - j)**也能够被拆分),其中 j 为区间 [ 0, i ] 的任意整数

具体实现:

首先将字典转换为无序集合,提高查找速度;原字符串拷贝至string_view类型,以实现零开销访问范围内的部分字符串;最后定义dp数组,用来记录前 i 个字符能否被拆分,注意这里的首位元素为真,因为空字符串肯定是能够被拆分的,其他位默认为假

进入循环——外层循环遍历原字符串,内层循环遍历字典;之后根据上述的 b 条件,确定字符串前i个元素是否能拆分

 1bool wordBreak(string s, vector<string>& wordDict)
 2{
 3    std::unordered_set<string_view> dict(wordDict.begin(), wordDict.end());
 4    std::string_view sv = s;
 5    std::vector<bool> dp(s.size() + 1, false);
 6    dp[0] = true;
 7
 8    for(int i = 1; i <= s.size(); i++)
 9    {
10        for(int j = 0; j < i; j++)
11        {
12            if(dp[j] && dict.find(sv.substr(j, i - j)) != dict.end())
13            {
14                dp[i] = true;
15                break;
16            }
17        }
18    }
19    return dp[s.size()];
20}