1. question: 反转字符串II(简单)
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii
示例 1:
1 2
| 输入:s = "abcdefg", k = 2 输出:"bacdfeg"
|
示例 2:
1 2
| 输入:s = "abcd", k = 2 输出:"bacd"
|
提示:
1 2 3
| 1 <= s.length <= 104 s 仅由小写英文组成 1 <= k <= 104
|
2. answers
这道题在反转字符串的基础上显示了反转的范围,因此只需要在遍历的时候,限制一下反转的下标即可。
第一种方法采用栈来反转,代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public class Solution_0040 {
public static String reverseStr(String s, int k) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
StringBuilder sb = new StringBuilder(); int index = 0;
for(char c: chars) { index += 1;
if(index <= k) { stack.push(c);
} else if(index <= 2*k) {
while(!stack.isEmpty()) { sb.append(stack.pop()); }
sb.append(c);
if(index == 2*k) index = 0;
} }
while(!stack.isEmpty()) { sb.append(stack.pop()); }
return sb.toString(); }
public static void main(String[] args) { System.out.println();
String s = "abcd";
System.out.println(reverseStr(s, 2)); } }
|
上面方法的时间和空间复杂度均为O(n)。实际上没必要用栈,可以直接在原始数组上进行修改。反转字符串采用首尾双指针的方法来做。这时候需要额外的起始指针。代码如下所示;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public class Solution_0040_02 {
public static String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
int start = 0, j = 1;
for (int i = 0; i < chars.length; i++) {
if(j == k) { reverse(chars, start, i); start = i + k + 1; }
if(j == 2*k) {
j = 0; }
j++; }
if(start <= chars.length - 1) { reverse(chars, start, chars.length - 1); }
return String.valueOf(chars); }
public static void reverse(char[] chars, int start, int end) {
char temp; while(start < end) {
temp = chars[start]; chars[start] = chars[end]; chars[end] = temp;
start += 1; end -= 1; } }
public static void main(String[] args) { System.out.println();
String s = "abcdefg";
System.out.println(reverseStr(s, 2)); } }
|
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。