Welcome to Subscribe On Youtube
541. Reverse String II
Description
Given a string s and an integer k, reverse the first k characters for every 2k characters counting from the start of the string.
If there are fewer 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 leave the other as original.
Example 1:
Input: s = "abcdefg", k = 2 Output: "bacdfeg"
Example 2:
Input: s = "abcd", k = 2 Output: "bacd"
Constraints:
1 <= s.length <= 104sconsists of only lowercase English letters.1 <= k <= 104
Solutions
-
Convert String to List: The string
sis converted into a list of characters,t. This conversion is necessary because strings in Python are immutable, meaning they cannot be changed after creation. Working with a list allows for the modification of individual characters. -
Loop Through Chunks: The
forloop iterates through the listtin steps of2k(k << 1). The<<operator is a bitwise left shift, effectively multiplyingkby 2. This step size is chosen because the task is to reverse everykcharacters in segments of2kcharacters, applying the reverse operation only to the firstkcharacters of each segment. -
Reverse Each Segment: Inside the loop, the slice
t[i : i + k]is reversed. The slice selects the firstkcharacters of the current2k-character segment starting from indexi. Thereversedfunction returns an iterator that yields the characters in reverse order. This reversed slice is then assigned back to the original slice location int, effectively reversing the characters in place. -
Join and Return: Finally, the list of characters
tis joined back into a string using''.join(t)and returned.
Example
Let’s consider an example to illustrate the process:
- Suppose
s = "abcdefg"andk = 2. - The list
twill initially be['a', 'b', 'c', 'd', 'e', 'f', 'g']. - The loop iterates in steps of
4(k << 1 = 4), meaning it will process the slicest[0:2]andt[4:6]. - In the first iteration,
t[0:2]is['a', 'b'], which gets reversed to['b', 'a']. - No changes are made to
t[2:4], so it remains['c', 'd']. - In the second iteration,
t[4:6]is['e', 'f'], which gets reversed to['f', 'e']. - The last character
gdoes not have a counterpart to form a completeksegment, so it remains unchanged. - The final list
tis['b', 'a', 'c', 'd', 'f', 'e', 'g'], which is then joined and returned as"bacdfeg".
-
class Solution { public String reverseStr(String s, int k) { char[] chars = s.toCharArray(); for (int i = 0; i < chars.length; i += (k << 1)) { for (int st = i, ed = Math.min(chars.length - 1, i + k - 1); st < ed; ++st, --ed) { char t = chars[st]; chars[st] = chars[ed]; chars[ed] = t; } } return new String(chars); } } -
class Solution { public: string reverseStr(string s, int k) { for (int i = 0, n = s.size(); i < n; i += (k << 1)) { reverse(s.begin() + i, s.begin() + min(i + k, n)); } return s; } }; -
''' class range(start, stop, step=1) >>> k = 1 >>> for i in range(0, 9, k): ... print(i) ... 0 1 2 3 4 5 6 7 8 >>> for i in range(0, 9, k << 1): ... print(i) ... 0 2 4 6 8 ''' ''' reversed(t[i : i + k]) VS t[i : i + k][::-1] reversed(t[i : i + k]) returns an iterator that yields elements of the sequence in reverse order more suitable when you don't need a list or are performing operations that can take advantage of an iterator like join() t[i : i + k][::-1] slicing to create a new list that is a reversed version of the slice t[i : i + k] more convenient where you need the reversed sublist to be a list >>> t = [11,22,33,44,55] >>> >>> >>> t[1:3][::-1] [33, 22] >>> >>> reversed(t[1:3]) <list_reverseiterator object at 0x109022950> >>> >>> list(reversed(t[1:3])) [33, 22] ''' class Solution: def reverseStr(self, s: str, k: int) -> str: t = list(s) for i in range(0, len(t), k << 1): # protected from out-of-index error t[i : i + k] = reversed(t[i : i + k]) return ''.join(t) ############ class Solution(object): def reverseStr(self, s, k): """ :type s: str :type k: int :rtype: str """ cnt = 0 isFirst = True a = "" b = "" ans = [] for c in s: if isFirst: a = c + a else: b += c cnt += 1 if cnt == k: if isFirst: ans.append(a) a = "" else: ans.append(b) b = "" isFirst = not isFirst cnt = 0 return "".join(ans) + a + b -
func reverseStr(s string, k int) string { t := []byte(s) for i := 0; i < len(t); i += (k << 1) { for st, ed := i, min(i+k-1, len(t)-1); st < ed; st, ed = st+1, ed-1 { t[st], t[ed] = t[ed], t[st] } } return string(t) } -
function reverseStr(s: string, k: number): string { const n = s.length; const cs = s.split(''); for (let i = 0; i < n; i += 2 * k) { for (let l = i, r = Math.min(i + k - 1, n - 1); l < r; l++, r--) { [cs[l], cs[r]] = [cs[r], cs[l]]; } } return cs.join(''); }