目錄
- leetcode 344.反轉字符串
- 1、題目
- 2、思考
- leetcode 541. 反轉字符串 II
- 1、題目
- 2、思考
leetcode 344.反轉字符串
1、題目
2、思考
典型的雙指針解法:
一個從前往后,一個從后往前,指針對應的交換即可。
class Solution {
public:void reverseString(vector<char>& s) {int start=0;int end=s.size()-1;if(end == -1) return ;while(start<=end){char tmp = s[start];s[start]=s[end];s[end] = tmp;start++;end--;}}
};
leetcode 541. 反轉字符串 II
1、題目
2、思考
交換的基礎部分還是和雙指針有關,主要增加了邏輯上的復雜程度。
我的邏輯描述如下:
1、獲取字符串長度(s_size )、并按照2k來劃分組數(group_nums ),并且計算剩下來的不能組成一組的元素的個數(left_nums )
2、將翻轉包裝成函數,只要輸入start 和end值即可
3、循環對組內的元素進行按照題目中的描述翻轉,確定start 為該組第一個元素,end為start加上k,保證前k個元素翻轉
4、對剩下的元素個數進行判斷
5、如果剩余字符小于k個,start = (group_nums) * 2 * k,end為s最后一個字符
6、如果剩余字符小于2k個,start = (group_nums) * 2 * k,end=start+k
class Solution {
public:void myreverse(string& s, int start, int end){while (start <= end){char tmp = s[start];s[start] = s[end];s[end] = tmp;start++;end--;}}string reverseStr(string s, int k) {int s_size = s.size();int group_nums = s_size / (2 * k);int count = group_nums;int left_nums = s_size - 2 * k * group_nums;while (count > 0){int start = (count - 1) * 2 * k;int end = start + k - 1;myreverse(s, start, end);count--;}//剩下字符翻轉if (left_nums < k){int start = (group_nums) * 2 * k;int end = s_size - 1;myreverse(s, start, end);}else if (left_nums < 2 * k){int start = (group_nums) * 2 * k;int end = start + k - 1;myreverse(s, start, end);}return s;}
};