Leetcode 139. 单词拆分

Leetcode 139. 单词拆分

  • 1、问题分析
  • 2、问题解决
  • 3、总结

1、问题分析

题目链接:https://leetcode-cn.com/problems/word-break/
  本质上就是一个深搜问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

#include "iostream"

using namespace std;

#include "algorithm"
#include "vector"
#include "queue"
#include "set"
#include "map"
#include "string"
#include "stack"

class Solution {
private:
    // 记录字符串是否访问过
    set<string> setKeysChen;
public:
    bool wordBreak(string s, vector<string> &wordDict) {
        // 判断字符串 s 是否 可以被字典 wordDict 中的字符拆分
        return dfs(s, wordDict);
    }

    /**
     * 判断字符串 s 是否 可以被字典 wordDict 中的字符拆分
     * @param s
     * @param wordDict
     * @return
     */
    bool dfs(string s, vector<string> &wordDict) {
        // 字符串 为空,到达递归边界,返回 true
        string temp = s;
        if (temp.empty()) {
            return true;
        }

        // 由于 set 是有序集和,直接查找即可
        // 如果该字符串已经计算过,直接返回 false
        // 因为计算成功的直接就走了
        auto iterator1 = setKeysChen.find(temp);
        if (iterator1 != setKeysChen.end()) {
            return false;
        }

        // 遍历 wordDict 数组
        for (int i = 0; i < wordDict.size(); ++i) {
            // 在字符串中查找是否有 wordDict 数组中的字符串
            auto pos_index = temp.find(wordDict[i]);
            // 如果找到了
            if (pos_index != string::npos) {
                // 这里只替换最前面和最后面的字符串
                if (pos_index == 0 ||
                    pos_index + wordDict[i].length() == temp.length()) {
                    // 用查找到的 wordDict 数组中的字符串 拆分 给定的单词
                    temp.replace(pos_index, wordDict[i].length(), "");
                    // 拆完后继续深搜
                    bool b = dfs(temp, wordDict);
                    // 如果深搜成功,那就返回 true
                    if (b) {
                        return true;
                    } else {
                        // 否则的话将值保存在 set 集和中
                        setKeysChen.insert(temp);
                        // 复原
                        temp = s;
                    }
                }
            }

        }

        return false;
    }

};

int main() {
    string s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
    vector<string> wordDict = {"a", "aa", "aaa", "aaaa", "aaaaa", "aaaaaa", "aaaaaaa", "aaaaaaaa", "aaaaaaaaa",
                               "aaaaaaaaaa"};
    Solution *pSolution = new Solution;
    bool b = pSolution->wordBreak(s, wordDict);
    cout << b << endl;
    system("pause");
    return 0;
}

运行结果

Leetcode 139. 单词拆分_第1张图片

有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

你可能感兴趣的:(LeetCode,Hot100,c++,字符串,leetcode,139.,单词拆分,深度优先搜索)