Reverse String II

easy two pointers string

Problem

For every 2k characters of s starting from the beginning, reverse the first k characters. If fewer than k remain, reverse all of them. If between k and 2k remain, reverse the first k and leave the rest as-is.

Inputs = "abcdefg", k = 2
Output"bacdfeg"
Chunks: "abcd" → reverse first 2 → "ba"+"cd"; "efg" → reverse first 2 → "fe"+"g".

def reverse_str(s, k):
    arr = list(s)
    for i in range(0, len(arr), 2 * k):
        arr[i:i + k] = reversed(arr[i:i + k])
    return "".join(arr)
function reverseStr(s, k) {
  const arr = s.split("");
  for (let i = 0; i < arr.length; i += 2 * k) {
    let lo = i, hi = Math.min(i + k - 1, arr.length - 1);
    while (lo < hi) {
      [arr[lo], arr[hi]] = [arr[hi], arr[lo]];
      lo++; hi--;
    }
  }
  return arr.join("");
}
class Solution {
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for (int i = 0; i < a.length; i += 2 * k) {
            int lo = i, hi = Math.min(i + k - 1, a.length - 1);
            while (lo < hi) {
                char t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                lo++; hi--;
            }
        }
        return new String(a);
    }
}
string reverseStr(string s, int k) {
    for (int i = 0; i < (int)s.size(); i += 2 * k) {
        int lo = i, hi = min(i + k - 1, (int)s.size() - 1);
        while (lo < hi) { swap(s[lo], s[hi]); lo++; hi--; }
    }
    return s;
}
Time: O(n) Space: O(n)