KMP 算法详解——从 next 数组的构建到回退的本质

用逐步模拟的方式把 KMP 算法讲透:next 数组到底在算什么,回退到底在干什么,为什么 i 不动。

March 12, 2026 · KahanaT800

代码随想录打卡第9天 | 151. 翻转字符串里的单词、55. 右旋字符串、28. 实现strStr()、459. 重复的子字符串

151. 翻转字符串里的单词 链接:151. 翻转字符串里的单词 文章:代码随想录 视频:B站讲解 状态:⚠️ 第一想法 第一想法感觉这道题好麻烦,然后拆解任务一共三步: 去掉两端以及中见多余的空格 翻转整个字符串 挨着翻转每个单词 其中在挨着翻转每个单词的时候因为尾端没有空格,所以临时加上一个空格在翻转完之后再去掉,避免了尾处理; 看完题解后的想法 原地去空格使用双指针法, 最后需要resize,注意使用的size就是slow最后停留的index; 实现中遇到的困难 —— 代码 class Solution { public: string reverseWords(string s) { endSpace(s); reverse(s, 0, (int)s.size()-1); int left = 0; int right = 0; while (right <= (int)s.size()) { if (right == (int)s.size() || s[right] == ' ') { reverse(s, left, right-1); left = ++right; } else { right++; } } return s; } // 去掉两端以及中见多余的空格 void endSpace(string& s) { int slow = 0; for (int fast = 0; fast < (int)s.size(); fast++) { if (s[fast] != ' ') { if (slow > 0) { s[slow++] = ' '; } while (fast < (int)s.size() && s[fast] != ' ') { s[slow++] = s[fast++]; } } } s.resize(slow); } // 翻转函数 void reverse(string& s, int left, int right) { int l = left; int r = right; while (l < r) { char tmp = s[r]; s[r] = s[l]; s[l] = tmp; l++; r--; } } }; KamaCoder 55. 右旋字符串 链接:KamaCoder 55. 右旋字符串 文章:代码随想录 视频:无 状态:⚠️ 第一想法 刚开始是准备整体移动+栈来构造新的字符串; ...

March 12, 2026 · KahanaT800

代码随想录打卡第8天 | 344. 反转字符串、541. 反转字符串II、54. 替换数字

344. 反转字符串 链接:344. 反转字符串 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 双指针法 看完题解后的想法 —— 实现中遇到的困难 —— 代码 class Solution { public: void reverseString(vector<char>& s) { int n = s.size(); int left = 0, right = n - 1; while (left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } }; 541. 反转字符串II 链接:541. 反转字符串II 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 反转字符串写成可传位置的函数,然后一段段翻转,最后处理尾巴; 看完题解后的想法 用 for 循环每次跳 2k 更简洁; 实现中遇到的困难 —— 代码 class Solution { public: string reverseStr(string s, int k) { int n = s.size(); int time = n / (2* k); int tail = n % (2* k); int index = 0; while (time > 0) { swapStr(s, index, index+k-1); index = index + 2 * k ; time--; } if (tail > 0 && tail < k) { swapStr(s, index, index+tail-1); } else { swapStr(s, index, index+k-1); } return s; } void swapStr(string& s, int l, int r) { int left = l, right = r; while (left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } }; KamaCoder 54. 替换数字 链接:KamaCoder 54. 替换数字 文章:代码随想录 视频:无 状态:⚠️ 第一想法 刚开始在纠结如何原地扩展; ...

March 11, 2026 · KahanaT800