1. 程式人生 > >leetcode-917-僅僅反轉字母

leetcode-917-僅僅反轉字母

ring 一個 tco while 符號 letters ats swa size

題目描述:

給定一個字符串 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。

leetcode-917-僅僅反轉字母