給定乙個字串,逐個翻轉字串中的每個單詞。
說明:無空格字元構成乙個 單詞 。
輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含乙個。
一、 從後往前找到找到單詞加入新字串
1class
solution
1112
while(j >= 0 && s[j] != '')
15int tmp = j; //
儲存單詞前的空格位置,後移為單詞的起始位置
16 j++;
17while(j < s.length() && s[j] != '')
21 j =tmp;
22 res += '';
23}24if(*(res.end() -1) == '
') res.erase(res.end()-1
);25
return
res;26}
27 };
二、按照carl提高下該題的難度,就是使用就地演算法,不開闢新的字串,怎樣實現
1.去除多餘空格
2.整體字串反轉
3.單詞再反轉
首先移除多餘空格,不要上來直接用erase刪除,因為最快的刪除字串的元素的時間複雜度也是o(n),再在外部套一層迴圈,實際時間複雜度為方。如何將降低?雙指標。
1class
solution
12//
若開頭有冗餘空格,利用雙指標將整體字串前移
13//
並且去除字串中間部分的冗餘空格---邏輯和27題一樣
14for(;fast < s.length();fast++)else20}
21//
此時slow指標指向了最後乙個單詞的有效字元的後乙個位置
22//
去除末尾的冗餘空格,用resize,slow之後都為冗餘字元
23if(slow > 0 && s[slow - 1] == '
') s.resize(slow - 1
);24
else
s.resize(slow);25}
26//
常見的陣列逆序操作,也是雙指標
27void reverse(string &s,int start,int
end)31}
3233
string reversewords(string
s) 44
if(((k > 0 ) && (s[k] == '
' )&& (s[k-1] != '
') &&(flag)))
4950
}51 reverse(s,i,s.length()-1
);52
53//
時間複雜度為n方的寫法
54//
while(j < s.length() && s[j] != ' ')
5758
//while(j < s.length())
62//
reverse(s,i,j -1);
63//
i = ++j;
6465//}
66return
s;67
}68 };
注意最後挑菜單詞進行反轉
LeetCode 151 翻轉字串
給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸入 a good ...
Leetcode 151 翻轉字串
給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸入 a good ...
leetcode151翻轉字串單詞
leetcode151.翻轉字串裡的單詞 題目描述 給定乙個字串,逐個翻轉字串中的每個單詞 示例 輸入 the sky is blue 輸出 blue is sky the 再這裡需要逐一的是輸入的字串可以在前面或者後面包含多餘的空格,但反轉後的單詞間的空格只能減少到乙個。思路 在這裡考慮進行兩次翻...