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

873 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

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

示例

输入: "ab-cd"
输出: "dc-ba"
输入: "a-bC-dEf-ghIj"
输出: "j-Ih-gfE-dCba"
输入: "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))。
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)

最后

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

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/re…