leetcode-917-仅仅反转字母

题目描述:

给定一个字符串 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 "

 

要完成的函数:

string reverseOnlyLetters(string S) 

说明:

1、给定一个字符串S,里面存放着字母(有大写有小写),和一些非字母符号。

现在要求将字符串中的字母反转,而非字母字符则停留在原地不做任何改变。

比如a-bcd,反转完应该是d-cba。

最后返回反转后得到的字符串。

2、这道题比较容易,定义两个指针,一个从前开始,一个从后开始,当两个指针对应的都是字母时,交换他们。

接着前面的指针往后走,后面的指针往前走,不断交换,直到两个指针到达同一个位置。

代码如下:(附详解)

    string reverseOnlyLetters(string S) 
    {
        int i=0,s1=S.size(),j=s1-1;
        while(i<j)//当i和j还没碰上时
        {
            if(isalpha(S[i]))//如果i对应的是字母
            {
                while(j>i)//当i和j还没碰上时
                {
                    if(isalpha(S[j]))//如果j对应的也是字母
                    {
                        swap(S[i],S[j]);//i和j对应的这两个字母彼此交换
                        j--;//j到下一位
                        break;//跳出循环,不用找j对应的字母了
                    }
                    j--;//如果不是字母,那么不断地找下去
                }
            }
            i++;//交换完之后,i往前走继续找下一个字母
        }
        return S;//最后返回“原地”交换完的字符串
    }

上述代码实测0ms,beats 100.00% of cpp submissions。

原文地址:https://www.cnblogs.com/chenjx85/p/9783438.html