leetcode541_翻转字符串
一、题目
二、分析
其实主要思路,仍然是先判断存在的整数周期,对其中前k个数字进行翻转,翻转可以参考之前的思路,进行双指针翻转,可以实现O(n)的复杂度。
另外一个方面,对于长度不满足2k的字符串,进行分别判断。
如果修改为迭代方式,那么需要考虑如何拆分字符串,保证最后能够返回完整的字符串。
另外一个需要考虑的事情是,如何设置截止条件。
即当拆分到最小的字符串数目的时候[1, 2k) 的时候,就可以返回最后的结果了。
顺序解法的复杂度为O(n)。
迭代解法大概也为O(n)。
三、代码
直接方式:
class Solution { public: string reverseStr(string s, int k) { int len = s.length(); //求整周期的长度 int num_period = len/2/k; int num_result = len%(2*k); int left = 0; int right = 0; char change; //对于整周期 for(int i=0; i<num_period; i++){ //对于每个周期的前k个数字 left = i*2*k; right = i*2*k + k - 1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } } left = num_period*2*k; //对于不满足整周期 if(num_result >= k){ right = left + k - 1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } } else if(num_result < k && num_result > 0){ right = len - 1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } } return s; } };
迭代方式
class Solution { public: string reverseStr(string s, int k) { int len = s.length(); int left = 0; int right = k-1; int change = 0; //如果大于2k if(len > 2*k){ right = k-1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } } else if (len >= k && len <= 2*k){ right = k-1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } return s; } else if(len < k && len>0){ right = len - 1; while(left < right){ change = s[right]; s[right] = s[left]; s[left] = change; left++; right--; } return s; } return s.substr(0,2*k) + reverseStr( s.substr(2*k,len-2*k), k); } };
纵一苇之所如,临万顷之茫然。