当前位置:   article > 正文

代码随想录算法训练营 day46|139.单词拆分

代码随想录算法训练营 day46|139.单词拆分

一、139.单词拆分

力扣题目链接

回溯

  1. class Solution {
  2. private:
  3. bool backtracking (const string& s,
  4. const unordered_set<string>& wordSet,
  5. vector<bool>& memory,
  6. int startIndex) {
  7. if (startIndex >= s.size()) {
  8. return true;
  9. }
  10. // 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果
  11. if (!memory[startIndex]) return memory[startIndex];
  12. for (int i = startIndex; i < s.size(); i++) {
  13. string word = s.substr(startIndex, i - startIndex + 1);
  14. if (wordSet.find(word) != wordSet.end() && backtracking(s, wordSet, memory, i + 1)) {
  15. return true;
  16. }
  17. }
  18. memory[startIndex] = false; // 记录以startIndex开始的子串是不可以被拆分的
  19. return false;
  20. }
  21. public:
  22. bool wordBreak(string s, vector<string>& wordDict) {
  23. unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
  24. vector<bool> memory(s.size(), 1); // -1 表示初始化状态
  25. return backtracking(s, wordSet, memory, 0);
  26. }
  27. };

动态规划

  1. class Solution {
  2. public:
  3. bool wordBreak(string s, vector<string>& wordDict) {
  4. unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
  5. vector<bool> dp(s.size() + 1, false);
  6. dp[0] = true;
  7. for (int i = 1; i <= s.size(); i++) { // 遍历背包
  8. for (int j = 0; j < i; j++) { // 遍历物品
  9. string word = s.substr(j, i - j); //substr(起始位置,截取的个数)
  10. if (wordSet.find(word) != wordSet.end() && dp[j]) {
  11. dp[i] = true;
  12. }
  13. }
  14. }
  15. return dp[s.size()];
  16. }
  17. };
  • 时间复杂度:O(n^3),因为substr返回子串的副本是O(n)的复杂度(这里的n是substring的长度)
  • 空间复杂度:O(n)

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/214815?site
推荐阅读
相关标签
  

闽ICP备14008679号