給定一個字符串,逐個翻轉(zhuǎn)字符串中的每個單詞俄精。
示例:
輸入: "the sky is blue",
輸出: "blue is sky the".
說明:
無空格字符構(gòu)成一個單詞婆赠。
輸入字符串可以在前面或者后面包含多余的空格浴麻,但是反轉(zhuǎn)后的字符不能包括够吩。
如果兩個單詞間有多余的空格比然,將反轉(zhuǎn)后單詞間的空格減少到只含一個。
進階: 請選用C語言的用戶嘗試使用 O(1) 空間復(fù)雜度的原地解法周循。
//1.翻轉(zhuǎn)
//2.按單詞反轉(zhuǎn)
void reverseWords(string &s) {
//強行頭部加空格方便統(tǒng)一處理
s.insert(0, 1, ' ');
reverse(s.begin(), s.end());
int len = s.size();
//搜索的位置
int search = 0;
//搜索的當前單詞的長度
int cnt_word = 0;
//搜索的當前單詞的起始位置
int start_word = 0;
while( search < len ){
//在單詞有效范圍內(nèi)
if(s[search] != ' ') ++search, ++cnt_word;
//在單詞邊界
else{
if(cnt_word != 0){
//翻轉(zhuǎn)單詞
reverse(s.begin() + start_word, s.begin() + start_word + cnt_word);
//去除多余的空格
search++;
while(search < len && s[search] == ' ') s.erase(s.begin() + search);
//設(shè)置下一個單詞搜索的初始位置和長度
start_word = search;
cnt_word = 0;
}
//可以去除原字符串中開頭和尾巴可能存在的連續(xù)空格
else s.erase(s.begin() + start_word);
}
}
//去除空格最后一個單詞附帶的空格
s.pop_back();
}