跳至主要內容

541, 反转字符串II

Mike大约 1 分钟stringeasystringtwo pointers

一、题目描述

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

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

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

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

提示

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

相关主题

  • 双指针
  • 字符串

二、题解

方法 1: 双指针

pub fn reverse_str(s: String, k: i32) -> String {
    let k = k as usize;
    let len = s.len();
    let p = unsafe { s.as_bytes_mut() };
    let mut begin = 0_usize;
    let mut end = begin + k;

    loop {
        if begin >= len {
            break;
        }
        if end > len {
            end = len;
        }

        let mut l = begin;
        let mut r = end - 1;
        while l < r {
            p.swap(l, r);
            l += 1;
            r -= 1;
        }

        begin += 2 * k;
        end = begin + k;
    }

    s
}