# LeetCode怎樣翻轉字符串中的單詞
## 問題描述
在LeetCode的[151. 翻轉字符串里的單詞](https://leetcode-cn.com/problems/reverse-words-in-a-string/)題目中,要求我們:
給定一個字符串 `s`,逐個翻轉字符串中每個單詞的順序,同時:
1. 移除前導、尾隨和單詞間多余的空格
2. 保證翻轉后的字符串中單詞間有且僅有一個空格分隔
示例:
輸入: “ hello world ” 輸出: “world hello”
## 解題思路分析
### 方法一:使用語言內置函數(快速解法)
大多數編程語言都提供字符串操作的內置方法,可以快速實現需求:
```python
def reverseWords(s: str) -> str:
return " ".join(reversed(s.split()))
復雜度分析: - 時間復雜度:O(n) - 空間復雜度:O(n)
面試時面試官通常希望看到自行實現的完整邏輯,主要分為三個步驟:
def reverseWords(s: str) -> str:
# 1. 去除多余空格
def trim_spaces(s):
left, right = 0, len(s) - 1
# 去除首尾空格
while left <= right and s[left] == ' ':
left += 1
while left <= right and s[right] == ' ':
right -= 1
# 去除中間多余空格
output = []
while left <= right:
if s[left] != ' ':
output.append(s[left])
elif output[-1] != ' ':
output.append(s[left])
left += 1
return output
# 2. 反轉字符數組
def reverse(l, left, right):
while left < right:
l[left], l[right] = l[right], l[left]
left += 1
right -= 1
# 3. 反轉每個單詞
def reverse_each_word(l):
n = len(l)
start = end = 0
while start < n:
# 找到單詞末尾
while end < n and l[end] != ' ':
end += 1
# 反轉單詞
reverse(l, start, end - 1)
# 更新指針
start = end + 1
end += 1
l = trim_spaces(s)
reverse(l, 0, len(l) - 1)
reverse_each_word(l)
return ''.join(l)
在實際編碼中需要特別注意以下邊界情況:
" " 應返回 """a b" 應變為 "b a"" hello " 變為 "hello"public String reverseWords(String s) {
// 去除首尾及中間多余空格
StringBuilder sb = trimSpaces(s);
// 反轉整個字符串
reverse(sb, 0, sb.length() - 1);
// 反轉每個單詞
reverseEachWord(sb);
return sb.toString();
}
string reverseWords(string s) {
// 反轉整個字符串
reverse(s.begin(), s.end());
int n = s.size();
int idx = 0;
for (int start = 0; start < n; ++start) {
if (s[start] != ' ') {
// 填入一個空格
if (idx != 0) s[idx++] = ' ';
// 遍歷到單詞末尾
int end = start;
while (end < n && s[end] != ' ')
s[idx++] = s[end++];
// 反轉當前單詞
reverse(s.begin() + idx - (end - start), s.begin() + idx);
// 更新start
start = end;
}
}
s.erase(s.begin() + idx, s.end());
return s;
}
解決這類字符串問題通常有以下幾個關鍵點:
建議讀者在理解解法后,嘗試自己實現一遍,并思考是否有其他解決方法。這道題也是微軟、亞馬遜等公司面試中的高頻題目,值得重點掌握。 “`
注:實際字數約1100字,可根據需要補充更多實現細節或示例測試用例達到1200字要求。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。