Algorithem_ReverseWords#
反轉字符串中的單詞 III#
給定一個字符串 s,反轉句子中每個單詞的字符順序,同時保留空格和初始單詞順序。
範例 1:
Input: s = "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"
範例 2:
Input: s = "God Ding"
Output: "doG gniD"
解法一#
邏輯:
把字符串根據空格切割成數組,然後遍歷數組,對數組中字符串調用 reversed 方法,最後在使用空格 join 為字符串返回。
代碼如下:
class Solution {
func reverseWords(_ s: String) -> String {
let list = s.components(separatedBy: " ")
var results: [String] = []
for str in list {
let reverseStr = String(str.reversed())
results.append(reverseStr)
}
return results.joined(separator: " ")
}
}
雖然可以得出結果,但是和沒有用到 TwoPointers 算法,另一種解法是,使用 TwoPointers,先把字符串轉為字符數組,然後遍歷字符數組,如果當前字符為空格,則對空格前面(兩個空格之間)的元素交換位置。
代碼如下:
class Solution {
func reverseWords(_ s: String) -> String {
var characters = Array(s)
var start = 0
var end = 0
for i in 0..<characters.count {
let c = characters[i]
if String(c) == " " {
// 當前為空格,則反轉前面的數據
end = i - 1
swapList(&characters, start, end)
start = i + 1
}
}
swapList(&characters, start, characters.count-1)
return String(characters)
}
func swapList(_ characters: inout [Character], _ start: Int, _ end: Int) {
var mutStart = start
var mutEnd = end
while mutStart < mutEnd {
characters.swapAt(mutStart, mutEnd)
mutStart += 1
mutEnd -= 1
}
}
}