LeetCode每日一题题解:917. 仅仅反转字母-双指针-python和C++

简介: LeetCode每日一题题解:917. 仅仅反转字母-双指针-python和C++

917. 仅仅反转字母


难度简单112收藏分享切换为英文接收动态反馈


给你一个字符串 s ,根据下述规则反转字符串:


所有非英文字母保留在原有位置。

所有英文字母(小写或大写)位置反转。

返回反转后的 s 。


示例 1:


输入:s = "ab-cd"

输出:"dc-ba"

示例 2:


输入:s = "a-bC-dEf-ghIj"

输出:"j-Ih-gfE-dCba"

示例 3:


输入:s = "Test1ng-Leet=code-Q!"

输出:"Qedo1ct-eeLg=ntse-T!"

提示


1 <= s.length <= 100

s 仅由 ASCII 值在范围 [33, 122] 的字符组成

s 不含 '\"' 或 '\\'

解题思路:


双指针,左右一起开始,如果都是字母直接相互换位置,否则继续左指针右移,右指针左移

python的.isalpha()函数用来判断改字符是不是字母,是字符返回True,否则返回False


下面附上python和C++的代码

python代码:

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        ans = list(s)# 将字符串转换为列表便于操作
        l , r = 0 , len(s)-1   #双指针
        while l < len(s) - 1:  #开始遍历字符串
            while l < r and not s[l].isalpha():  #如果不是字母,则左指针向右移
                    l += 1                       
            while l < r and not s[r].isalpha():  #如果不是字符,则右指针向左移
                    r -= 1
            if l >= r:     #如果左指针大于等于右指针,则跳出循环
                break
            ans[l] , ans[r] = ans[r] , ans[l]  #左右指针的值交换
            l += 1  #左指针加一
            r -= 1   #有指针减一
        return ''.join(ans)  #将列表转换为字符串输出结果


C++代码:


class Solution {
public:
    string reverseOnlyLetters(string s) {
        int n = s.size(); //求出s数组的长度
        int l = 0 , r = n-1;   // 定义双指针
        while (l < (n-1)) {   //开始构造循环
            while (l < r && !isalpha(s[l])) {  
                l++;
            }
            while (l < r && !isalpha(s[r])) {
                r--;
            }
            if (l >= r) {
               break;
            }
相关文章
|
存储 算法
LeetCode第49题字母异位词分组
LeetCode第49题"字母异位词分组"的解题方法,通过将每个字符串的字符排序后作为键存储在HashMap中,有效地将所有字母异位词分组。
LeetCode第49题字母异位词分组
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
520 11
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
521 2
|
算法 容器
【算法】——双指针算法合集(力扣)
移动零,复写零,快乐数,盛最多水的容器,有效三角形的个数,和为s的两个数(查找总价格为目标值的两个商品 ),三数之和,四数之和
|
存储
Leetcode第49题(字母异位词分组)
LeetCode第49题要求将字符串数组中的字母异位词分组,可以通过将每个字符串排序后作为键存入哈希表,最后将哈希表中的值添加到结果列表中来实现。
197 1
|
算法
Leetcode第十七题(电话号码的字母组合)
这篇文章介绍了如何使用深度优先搜索(DFS)算法来解决LeetCode第17题——电话号码的字母组合问题,通过递归方法生成所有可能的字母组合。
227 0
Leetcode第十七题(电话号码的字母组合)
|
索引
【LeetCode 11】242.有效的字母异位词
【LeetCode 11】242.有效的字母异位词
181 0
【LeetCode 11】242.有效的字母异位词
LeetCode第17题电话号码的字母组合
该文章介绍了 LeetCode 第 17 题电话号码的字母组合的解法,通过分析得出可使用递归和回溯的思想解决,避免循环穷举的高循环次数,并给出了具体的编码实现,同时总结了该题较难理解,需要了解递归的本质,当嵌套循环层次多时可考虑递归。
LeetCode第17题电话号码的字母组合
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
411 0
【Leetcode刷题Python】73. 矩阵置零
|
算法
【LeetCode 52】17.电话号码的字母组合
【LeetCode 52】17.电话号码的字母组合
208 0

推荐镜像

更多