leetcode算法541. 反转字符串 II

88 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

一、题目描述:

541. 反转字符串 II - 力扣(LeetCode)

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。  

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 10^4
  • s 仅由小写英文组成
  • 1 <= k <= 10^4

二、思路分析:

依题意,当字符串存在2k的长度时,对字符串进行处理
(1)先声明一个返回结果的空字符串result,然后根据字符串的长度slen进行while,当slen大于0时才循环
(2)使用index变量记录每一次处理字符串的首字母下标,然后通过字符串切片的方式对所需的前k个字符的字符串进行反转,接着再拼接在result的后面,将剩余的K个字符原封不动地拼接到result后面,然后将index+2k,改变下一次开始处理的字符串下标,此时slen应减去2*K个长度
(3)当slen < k时,直接将剩余的字符利用字符串切片的方式反转,然后再拼接到result,接着break退出循环
(4)当slen < 2k && slen >= k时,将剩余字符串的前k个字符串反转,再拼接到result,接着break退出循环
(5)最后返回结果result

三、AC 代码:

class Solution {
    public String reverseStr(String s, int k) {
          int n = s.length();
          char[] ch = s.toCharArray();
          for(int i = 0; i < s.length(); i += 2*k ){
             int start = i;
             int end = Math.min(n - 1,start + k - 1);
             while(start < end){
                 char temp = ch[start];
                 ch[start] = ch[end];
                 ch[end] = temp;
                 start++;
                 end--;
             }
          }
   
    return new String(ch);
}

范文参考:

反转字符串 II(在一个个固定区间内进行反转,即首a和尾b交换,再a++、b--继续交换) - 反转字符串 II - 力扣(LeetCode)