1. 程式人生 > >【劍指offer】58、翻轉字符串

【劍指offer】58、翻轉字符串

rst ring 前閉後開 輸入 是把 叠代器 oid swa front

題目一

輸入英文句子,翻轉句子中單詞的順序,但單詞內字符順序不變,標點當作普通字母處理。

如I am a student. 輸出student a am i

思路

第一步翻轉整個句子,.tneduts a ma I

第二次翻轉每個單詞,student. a am I

(代碼用了reverse函數,也可以自己寫)

若用庫函數,需要註意,叠代器的區間表示是前閉後開,[first, last),也就是[first, last-1]

class Solution {
public:
    string ReverseSentence(string str) {
        reverse(str.begin(),str.end());
        
int front=0; int back=0; int size = str.size(); while(front < size) { while(front < size && str[front] == ) ++front; back=front; while(back < size && str[back] != ) ++back; reverse(str.begin()
+ front, str.begin() + back); front = back; } return str; } };

下面是重寫ReverseCore,思路一樣

class Solution {
public:
    string ReverseSentence(string str) {
        int front=0;
        int back=0;
        int size = str.size();
        ReverseCore(str,0, size - 1);
        
while(front < size) { while(front < size && str[front] == ) ++front; back=front; while(back < size && str[back] != ) ++back; ReverseCore(str, front, back - 1); front = back; } return str; } void ReverseCore(string& str, int begin, int end){ if (begin > end) return; while (begin < end) swap(str[begin++], str[end--]); } };

題目二

字符串的左旋操作是把字符串前面若幹個字符轉移到字符串尾部。如 abcdefg和數字2,輸出 cdefgab

思路

借助上題思路,可以理解為 ab cdefg 然後按上述翻轉字符串。

思想完全一樣,先翻轉整個,然後局部翻轉。

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.size();
        if (len == 0 || n > len)
            return "";
        reverse(str.begin(), str.end());
        reverse(str.begin(), str.begin() + len - n);
        reverse(str.begin() + len - n, str.end());
        return str;
    }
};

【劍指offer】58、翻轉字符串