【劍指offer】58、翻轉字符串
阿新 • • 發佈:2018-07-22
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、翻轉字符串