leetcode 541. 反转字符串 II(Reverse String II)

题目描述:

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"

要求:

  1. 该字符串只包含小写的英文字母。
  2. 给定字符串的长度和 k 在[1, 10000]范围内。

解法:

class Solution {
public:
    
    // method 1:
    string reverseStr1(string s, int k){
        int sz = s.size();
        int i = 0, j = 0;
        bool flip = true;
        string res = "";
        string tmp = "";
        while(i < sz){
            while(j < sz && j < i + k){
                j++;
            }
            if(flip){
                tmp = s.substr(i, j-i);
                tmp = string(tmp.rbegin(), tmp.rend());
            }else{
                tmp = s.substr(i, j-i);
            }
            // cout<<tmp<<endl;
            res += tmp;
            flip = !flip;
            i = j;
        }
        return res;
    }
    
    // method 2:
    string reverseStr2(string s, int k) {
        string t = "";
        int sz = s.size();
        for(int i = 0; i < sz; i+=2*k){
            for(int j = k-1; j >= 0; j--){
                if(i+j >= sz){
                    continue;
                }
                t += s[i+j];
            }
            for(int j = 0; j < k; j++){
                if(i+j+k >= sz){
                    break;
                }
                t += s[i+j+k];
            }
        }
        return t;
    }
    
    string reverseStr(string s, int k) {
        // return reverseStr1(s, k);
        return reverseStr2(s, k);
    }
};
posted @ 2019-03-26 10:00  zhanzq1  阅读(100)  评论(0)    收藏  举报