小鱼刷leetcode---541. 反转字符串 II

23 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

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

给定一个字符串 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

二、思路分析:

首先字符反转可直接调用StringBuilder(str).reverse()
我们将字符串看成一段段2k子串 标记起始位置 每次遍历satrt+=2*k 超过len结束
定义firstK和secondK记录等一个k和第二个k的位置 超过len就标记为len
因为少于k个全部翻转,大于k个翻转前k个那么在前k位置的子串一定会反转 (start,firstK)
用StringBuffer.append把反转后的字符串
要进行末尾情况判断,如果firstK<secondK那么firstK,secondK之间字符串加入结果串
此外则说明start+k>len 末尾段翻转后加入结果串结束即可

三、AC 代码:

class Solution {
    public String reverseStr(String s, int k) {
        int len=s.length();
        if(len<k)
            return rever(s);
        StringBuffer res = new StringBuffer();
        int start = 0;
        while(start<len){
            
            int firstK=(start+k>len)?len:start+k;  //超过则直接定为len
            int secondK = (start+2*k>len)?len:start+2*k;

            //前k个位置一定会反转
            res.append(rever(s.substring(start,firstK)));//加入前k
            if(firstK<secondK) //剩余长度大于k
                res.append(s.substring(firstK,secondK));//加入后k
            start+=2*k;
        }
        return res.toString();

    }

    public String rever(String str){//反转字符串
        return new StringBuilder(str).reverse().toString();
        //或者存入字符数组从后加至新字符串
    }
}

范文参考:

好好看下代码和详解,这道题很独特 - 反转字符串 II - 力扣(LeetCode)