Skip to content
On this page

541-反转字符串II

标签:双指针 字符串

题目信息

题目地址541. 反转字符串 II

题目内容:

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

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

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

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

提示:
    1 <= s.length <= 104
    s 仅由小写英文组成
    1 <= k <= 104

题解

解法一

思路:

从字符串开头开始遍历,遍历索引为i

判断i + k 是否 <= s.length

如果成立则符合剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样

如果不成立则符合剩余字符少于k个,则将剩余字符全部反转

反转后然后将i += 2ki每次加上2k,直到遍历完字符串

leetcode-541-reverse-string-ii

代码实现:

javascript
/**
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
var reverseStr = function(s, k) {
    const reverseStr = (str, start, end) => {
        const targetStrArr = str.substring(start, end).split('')
        let left = 0, right = targetStrArr.length
        while(left < right) {
            [targetStrArr[left], targetStrArr[right]] = [targetStrArr[right], targetStrArr[left]]
            left++
            right--
        }
        return `${str.substring(0, start)}${targetStrArr.join('')}${str.slice(end)}`
    }
    for(let i = 0; i < s.length; i += k * 2) {
        // 先反转2k个中的前k个
        if(i + k <= s.length) {
            s = reverseStr(s, i, i + k)
            continue
        }
        // 剩余字符少于 k 个,则将剩余字符全部反转
        s = reverseStr(s, i, s.length)
    }
    return s
};