917. 仅仅反转字母(C++)

题目

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

示例 1:

输入:"ab-cd"
输出:"dc-ba"

示例 2:

输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3:

输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

提示:

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

分析与题解

同时使用两个指针从首部和尾部遍历字符串中的元素:当其中某个指针下标指向的元素不为大/小写字母时,将指针进行推移直到两个指针同时满足条件,则将下标指向的元素进行交换。

代码如下:

class Solution {
public:
    string reverseOnlyLetters(string S) {
        int i=0,j=S.size()-1;
        while(i<=j){
            if((S[i]<'A'||S[i]>'Z')&&(S[i]<'a' || S[i]>'z')){
                i++;
                continue;
            }
            if((S[j]<'A'||S[j]>'Z')&&(S[j]<'a' || S[j]>'z')){
                j--;
                continue;
            }
            char tmp = S[i];
            S[i] = S[j];
            S[j] = tmp;
            i++;
            j--;
        }
        return S;
    }
};

如果使用宏定义isalpha来判断字符是否为字母,并且使用swap函数来进行两个字符间的交换,可以使代码更加精简,如下:

class Solution {
public:
    string reverseOnlyLetters(string S) {
        int i=0,j=S.length()-1;
        while(i<j){
            if(!isalpha(S[i])){
                i++;
                continue;
            }
            if(!isalpha(S[j])){
                j--;
                continue;
            }
                
            swap(S[i],S[j]);
            i++;
            j--;
        }
        return S;
    }
};
posted @ 2020-08-21 16:52  脱线森林`  阅读(189)  评论(0编辑  收藏  举报