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);
    }
};

 

posted @ 2021-12-05 20:40  星光夜  阅读(27)  评论(0)    收藏  举报