Reverse String II

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.
  • Restrictions:
1. The string consists of lower English letters only.

2. Length of the given string and k will in the range [1, 10000]
  • Examples:
Input: s = "abcdefg", k = 2
Output: "bacdfeg"
  • Analysis:
According to problem, reverse the first k characters for every 2k characters and less than 2k but greater than k.

For every k, it will be [reverse, non-reverse, reverse, non-reverse,....]
  • Code - Java:
public class Solution {
    public String reverseStr(String s, int k) {
        int len = s.length();
        StringBuilder builder = new StringBuilder();
        int left = 0;
        boolean rev = false;
        for (int i = 0; i < len; i++) {
            if (i % k == 0) {
                String subStr = s.substring(left, i);
                if (rev) {
                    subStr = new StringBuilder(subStr).reverse().toString();
                }
                builder.append(subStr);
                left = i;
                rev = !rev;
            }
        }
        String subStr = s.substring(left, len);
        if (rev) {
            subStr = new StringBuilder(subStr).reverse().toString();
        }
        builder.append(subStr);
        return builder.toString();
    }
}
  • Code - C++:
class Solution {
public:
    string reverseStr(string s, int k) {
        int len = s.length();
        string builder ="";
        int left = 0;
        bool rev = false;
        for (int i = 0; i < len; i++) {
            if (i % k == 0) {
                string subStr = s.substr(left, i - left);
                if (rev) {
                    reverse(subStr.begin(), subStr.end());
                }
                builder += subStr;
                left = i;
                rev = !rev;
            }
        }
        string subStr = s.substr(left, len - left);
        if (rev) {
            reverse(subStr.begin(), subStr.end());        
        }
        builder += subStr;
        return builder;
    }
};
  • Code - Python:
class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        sLen = len(s)
        builder = ""
        left = 0
        rev = False
        for i in range(sLen):
            if i % k == 0:
                subStr = s[left:i]
                if rev:
                    subStr = subStr[::-1]
                builder += subStr
                left = i
                rev = not rev
        subStr = s[left:sLen]
        if rev:
            subStr = subStr[::-1]
        builder += subStr
        return builder
  • Time Complexity: O(N), N is the length of string s

  • Space Complexity: O(N), N is the length of string s

results matching ""

    No results matching ""