LeetCode 力扣官方题解 | 541. 反转字符串II
文章插图
力扣 541.反转字符串 II「链接」(点击查看题目)
题目描述
给定一个字符串 s 和一个整数 k , 你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转 。
- 如果剩余字符少于 k 个 , 则将剩余字符全部反转 。
- 如果剩余字符小于 2k 但大于或等于 k 个 , 则反转前 k 个字符 , 其余字符保持原样 。
输入: s = "abcdefg", k = 2输出: "bacdfeg"
提示:- 该字符串只包含小写英文字母 。
- 给定字符串的长度和 k 在 [1, 10000] 范围内 。
暴力
算法和想法
我们直接翻转每个 2k 字符块 。
每个块开始于 2k 的倍数 , 也就是 0, 2k, 4k, 6k, ... 。 需要注意的一件是:如果没有足够的字符 , 我们并不需要翻转这个块 。
为了翻转从 i 到 j 的字符块 , 我们可以交换位于 i++ 和 j-- 的字符 。
Python 实现
class Solution(object):def reverseStr(self, s, k):a = list(s)for i in xrange(0, len(a), 2*k):a[i:i+k] = reversed(a[i:i+k])return "".join(a)
Java 实现class Solution {public String reverseStr(String s, int k) {char[] a = s.toCharArray();for (int start = 0; start < a.length; start += 2 * k) {int i = start, j = Math.min(start + k - 1, a.length - 1);while (i < j) {char tmp = a[i];a[i++] = a[j];a[j--] = tmp;}}return new String(a);}}
复杂度分析- 时间复杂度:O(N) , 其中 N 是 s 的大小 。 我们建立一个辅助数组 , 用来翻转 s 的一半字符 。
- 空间复杂度:O(N) , a的大小 。
声明:本文归“力扣”版权所有 , 如需转载请联系 。
- 小米科技|顶级旗舰价格下跌,12GB+256GB+2K+50倍变焦,官方直降1300元
- OPPO|OPPO未来科技大会正式官宣,官方明示将有旗舰新品和创新技术亮相
- 安卓|全球首部跑分破百万的安卓旗舰机来了,官方宣布已经量产!
- 小米科技|官方直降800元,256GB+一亿像素三摄,2K曲面屏旗舰加速让路
- 华为鸿蒙系统|幸福来得太突然!华为5G手机终于现货,官方认证+麒麟990+鸿蒙OS
- 荣耀|小米12会有四大突破,这是官方高管确认的
- 裁员|爱奇艺回应裁员传言:以官方信息为准
- 小米科技|仅此一个!高通官方确认:小米12全球首发骁龙8
- 爱奇艺|爱奇艺回应“裁员 20%-40%”传言:以官方信息为准
- 高通骁龙|官方确认,小米12将全球首发新骁龙8旗舰主控