前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >力扣刷题笔记【双指针篇】 → 917. 仅仅反转字母

力扣刷题笔记【双指针篇】 → 917. 仅仅反转字母

作者头像
玖柒的小窝
修改2021-11-01 11:15:00
2910
修改2021-11-01 11:15:00
举报
文章被收录于专栏:各类技术文章~

题目

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

示例

代码语言:javascript
复制
输入: "ab-cd"
输出: "dc-ba"
复制代码
代码语言:javascript
复制
输入: "a-bC-dEf-ghIj"
输出: "j-Ih-gfE-dCba"
复制代码
代码语言:javascript
复制
输入: "Test1ng-Leet=code-Q!"
输出: "Qedo1ct-eeLg=ntse-T!"
复制代码

提示

  1. S.length <= 100
  2. 33 <= S[i].ASCIIcode <= 122
  3. S 中不包含 \ or "

解题思路

双指针

要将字符串进行翻转操作,同时字符串中除了字母部分,其余字符均保留在原地。那么我们就不能直接交换首尾两处的元素,得加多一层判断,跳过非字母部分,再进行交换。

  1. 将字符串转化成字节数组,便于元素交换;
  2. 定义left, right首尾两个指针;
  3. 判断是否为字母,这里可以用API来判断(Character.isLetter(char c))。
代码语言:javascript
复制
class Solution {
    public String reverseOnlyLetters(String s) {
        // 转换成数组
        char[] sChar = s.toCharArray();
        // 定义指针
        int left = 0, right = sChar.length - 1;
        // 遍历数组
        while(left < right){
            // 左边跳过非字母部分
            while(left < right && !Character.isLetter(sChar[left])){
                ++left;
            }
            // 右边跳过非字母部分
            while(left < right && !Character.isLetter(sChar[right])){
                --right;
            }
            // 交换元素
            char c = sChar[left];
            sChar[left++] = sChar[right];
            sChar[right--] = c;
        }
        // 将字节数组从新转化成字符串并返回
        return new String(sChar);
    }
}
复制代码

复杂度分析

  • 时间复杂度:O(N)O(N)O(N)
  • 空间复杂度:O(N)O(N)O(N)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • 提示
  • 解题思路
    • 双指针
    • 最后
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档