diff --git a/pics/541_反转字符串II.png b/pics/541_反转字符串II.png new file mode 100644 index 00000000..45f0ce6c Binary files /dev/null and b/pics/541_反转字符串II.png differ diff --git a/problems/0541.反转字符串II.md b/problems/0541.反转字符串II.md index bf3f81a9..2c93de82 100644 --- a/problems/0541.反转字符串II.md +++ b/problems/0541.反转字符串II.md @@ -4,9 +4,37 @@ https://leetcode-cn.com/problems/reverse-string-ii/ ## 思路 +先做0344.反转字符串,在做这道题目更好一些 +for循环中i 每次移动 2 * k,然后判断是否需要有反转的区间 + +性能如下: + ## C++代码 + +使用C++库里的反转函数reverse + +``` +class Solution { +public: + string reverseStr(string s, int k) { + for (int i = 0; i < s.size(); i += (2 * k)) { + // 1. 每隔 2k 个字符的前 k 个字符进行反转 + // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 + if (i + k <= s.size()) { + reverse(s.begin() + i, s.begin() + i + k ); + continue; + } + // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 + reverse(s.begin() + i, s.begin() + s.size()); + } + return s; + } +}; +``` + +自己实现反转函数 ``` class Solution { public: @@ -16,22 +44,20 @@ public: swap(s[i], s[j]); } } - -// C++ 自带了reverse 方法,但是我依然建议自己实现 string reverseStr(string s, int k) { - bool entry = false; - int i; - for (i = 0; i < s.size(); i += (2 * k)) { + for (int i = 0; i < s.size(); i += (2 * k)) { + // 1. 每隔 2k 个字符的前 k 个字符进行反转 + // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 if (i + k <= s.size()) { - // std::reverse(s.begin() + i, s.begin() + i + k ); reverse(s, i, i + k - 1); continue; } - // std::reverse(s.begin() + i, s.begin() + s.size()); + // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 reverse(s, i, s.size() - 1); } return s; } }; ``` + > 笔者在先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,本文 [GitHub](https://github.com/youngyangyang04/leetcode-master ):https://github.com/youngyangyang04/leetcode-master 已经收录,欢迎star,fork,共同学习,一起进步。