LeetCode_翻轉字串_第151題:翻轉字串中的單詞
阿新 • • 發佈:2020-12-30
給定一個字串,逐個翻轉字串中的每個單詞。
說明:
無空格字元構成一個 單詞 。
輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
示例 1:
輸入:"the sky is blue"
輸出:"blue is sky the"
示例 2:
輸入:" hello world! "
輸出:"world! hello"
解釋:輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
輸入:"a good example"
輸出:"example good a"
解釋:如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
示例 4:
輸入:s = " Bob Loves Alice "
輸出:"Alice Loves Bob"
示例 5:
輸入:s = "Alice does not even like bob"
輸出:"bob like even not does Alice"
提示:
1 <= s.length <= 104
s 中 至少存在一個 單詞
進階:
請嘗試使用O(1) 額外空間複雜度的原地解法。
// 普通 class Solution { public: string reverseWords(string s) { int len = s.length(); if(len == 0) return ""; string res = ""; int j = len - 1; while(j >= 0) { if(s[j] == ' ') { j--; continue; } while(j >= 0 && s[j] != ' ') { j--; } int pos = j; j++;// 現在指向的是空格 需要向右移一個空格 指向單詞開頭 while(s[j] != ' ' && j < len) { res += s[j]; j++; } j = pos; res += ' '; } if(res[res.length() - 1] == ' ') res.erase(res.length() - 1, 1); return res; } };
//原地演算法
class Solution {
public:
string reverseWords(string s) {
if(s.length() == 0)
return "";
//去除首尾空格 erase
delFirstEnd(s);
//反轉整個字串
reverse(s, 0, s.length() - 1);
int i = 0, j = 0;
while(j < s.length())
{
if(s[j] != ' ')
{
j++;
if(j == s.length())
{
//手動處理最後一個字元
reverse(s, i, j - 1);
break;
}
}
else
{
reverse(s, i, j - 1);
j++;
while(j < s.length() && s[j] == ' ')
{
s.erase(j, 1);
}
i = j;
}
}
return s;
}
void delFirstEnd(string &str)
{
if(str.empty())
return ;
str.erase(0, str.find_first_not_of(' '));
str.erase(str.find_last_not_of(' ') + 1);
}
//自定義反轉
void reverse(string &str, int left, int right)
{
if(right - left < 1 || right >= str.length())
return ;
while(left < right)
{
char temp;
temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
}
};