LeetCode 541. Reverse String II(C++版)

来源:互联网 发布:加入放心淘宝贝没打标 编辑:程序博客网 时间:2024/05/29 14:01

题目描述:

Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.

Example:

Input: s = "abcdefg", k = 2Output: "bacdfeg"

Restrictions:
  1. The string consists of lower English letters only.
  2. Length of the given string and k will in the range [1, 10000]

思路分析:

把s按照2k长度为单位处理,最后再处理一个不足2k长度的。每一个2k长度中,得到两个k长度的子串,前k个反转,后k个不变,加入结果字符串s中。

代码:

class Solution {public:    string reverseWord(string &s) {                int len = s.length();        for(int i = 0; i < len/2; i ++) {            char tmp = s[i];            s[i] = s[len-i-1];            s[len-1-i] = tmp;        }        return s;    }    string reverseStr(string s, int k) {        if(k <= 1) return s;                string res="";        int len = s.length();        int p = 2*k; //2k个字符为一组,每组中前k个需反转        int cnt = len / p; //一共有cnt个2k长度的字符串        int remaider = len % p; //最后剩下的一组,不足2k个字符                //先处理前cnt个2k长度的字符串        for(int i = 0; i < cnt; i ++) {            string s1 = s.substr(p*i, k);            string s2 = s.substr(p*i+k, k);            reverseWord(s1);            res += s1 + s2;        }        //处理剩下的一个不足2k的字符串        if(remaider <= k){            string s1 = s.substr(cnt*p);            reverseWord(s1);            res += s1;        }        else {            string s1 = s.substr(cnt*p, k);            string s2 = s.substr(cnt*p+k);            reverseWord(s1);            res += s1 + s2;        }        return res;    }};

Runtime: 9 ms