KMP 算法详解——从 next 数组的构建到回退的本质
用逐步模拟的方式把 KMP 算法讲透:next 数组到底在算什么,回退到底在干什么,为什么 i 不动。
用逐步模拟的方式把 KMP 算法讲透:next 数组到底在算什么,回退到底在干什么,为什么 i 不动。
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. 右旋字符串 文章:代码随想录 视频:无 状态:⚠️ 第一想法 刚开始是准备整体移动+栈来构造新的字符串; ...