开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
//或者存入字符数组从后加至新字符串
}
}