String Algorithm: Reverse the first k characters for every 2k ch

  • 时间:2020-09-23 15:11:59
  • 分类:网络文摘
  • 阅读:90 次

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 = 2
Output: “bacdfeg”

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

The problem statement is actually a bit hard to understand, but once you get it, this problem is easy to solve.

How to Reverse string in C++ using std::reverse for the first k characters?

The std::C++ has a handy reverse method that takes two iterators, and reverse it. Thus, we can iterate from the start, and increment the step of 2*k, compute the range, which is then passed to the reverse function to do the work.

1
2
3
4
5
6
7
8
9
10
class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
            int a = i, b = min(i + k, (int)s.size());
            reverse(begin(s) + a, begin(s) + b);
        }
        return s;
    }
};
class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
            int a = i, b = min(i + k, (int)s.size());
            reverse(begin(s) + a, begin(s) + b);
        }
        return s;
    }
};

You can also use a two pointer to swap until they meet in the middle.

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
            int a = i, b = min(i + k, (int)s.size());
            int left = a, right =  b - 1;
            while (left < right) {
                swap(s[left ++], s[right --]);
            }
        }
        return s;
    }
};
class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += 2 * k) {
            int a = i, b = min(i + k, (int)s.size());
            int left = a, right =  b - 1;
            while (left < right) {
                swap(s[left ++], s[right --]);
            }
        }
        return s;
    }
};

Other string reversing algorithms:

  • How to Reverse Words in a String in Place using C++ std::reverse?
  • How to Reverse Words in a String?
  • How to Reverse Only Letters in a String?
  • How to Reverse Vowels of a String in C/C++?
  • Reverse String in C/C++

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
给哪些网站暂时赚不到钱的站长鼓鼓劲  个人站长 建设网站贵在坚持  网站站长赚钱的6大好用的途径  整理6款站长赚钱方法 希望对你有所帮助  个人站长们常见的很多个网站盈利模式总结  春季饮食宜润肺,常吃炖梨既滋润又养人,口感甜香味道美  这道小学应用题比较难,解题关键是求相遇时间  豆腐搭配鸡蛋做出香酥可口的丸子,营养也很丰富  这道小学奥数题难倒多数学生,解题关键是比例  分享茄子的家常做法,吃起来不油腻,营养美味又下饭 
评论列表
添加评论