单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

1 暴力解法

按照题目的意思,字符串是由字符串列表拼接而成,故可以使用字符串列表去字符串中进行碰撞,如果全部的字符串列表都碰撞不到结果则返回false。

具体代码如下:

class Solution {
public:
    bool wordBreak(string s, vector& wordDict) {
        int start = 0, length = s.size();
        while(s.substr(start, length) != ""){
            int flag = 0;
            for(auto word:wordDict){
                if (word == s.substr(start, word.size())){
                    flag = 1;
                    start = start + word.size();
                    length = s.size() - start;
                }
            }
            if (!flag) return false;
        }
        return true;
    }
};

报错示例为:上述暴力做法为贪心思想,无法达到全局最优。cars->car,剩一个s无法被碰撞,返回false。实际上可以划分为[“ca”, “rs”]。

2 动态规划

从上述暴力做法中发现贪心暴力算法无法解决该问题,只能上动态规划算法了。