题目1:151.翻转字符串里的单词
思考:
- 字符串单词翻转 可以转化为 用字符串整体翻转 + 每个单词再次翻转。
- 移除空格 可以联想到移除元素的 双指针方式进行处理。
// @lc code=start
class Solution {
func reverseWords(_ s: String) -> String {
var array = removeWhitespace(s)
reverseChars(&array, start: 0, end: array.count - 1)
var left = 0
for right in 0...array.count {
// 第一个条件命中处理的是最后一个单词
if right == array.count || array[right] == " " {
reverseChars(&array, start: left, end: right - 1)
left = right + 1
}
}
return String(array)
}
// 反转字符数组的其中一部分
func reverseChars(_ array: inout [Character], start: Int, end: Int) {
var left = start
var right = end
while left < right, right < array.count {
(array[left], array[right]) = (array[right], array[left])
left += 1
right -= 1
}
}
// 移除消除空格,类似于移除元素题目
func removeWhitespace(_ s: String) -> Array<Character> {
var slow = 0
var fast = 0
var array = Array(s)
while fast < array.count {
if array[fast] != " " {
if slow != 0 {
array[slow] = " "
slow += 1
}
while fast < array.count, array[fast] != " " {
array[slow] = array[fast]
slow += 1
fast += 1
}
}
fast += 1
}
return Array(array[0..<slow])
}
}
// @lc code=end
题目2: 55.右旋转字符串
思考:
同样沿用 整体反转+部分反转的思路。 把字符串从要旋转的地方拆分成 两个字符串。
就是 151.翻转字符串里的单词这个题目了。
func rotateWords(_ s: String, _ k: Int) -> String {
var chars = Array(s)
reverseWords(&chars, start: 0, end: s.count - 1)
reverseWords(&chars, start: 0, end: k - 1)
reverseWords(&chars, start: k, end: s.count - 1)
return String(chars)
}
func reverseWords(_ chars: inout [Character], start: Int, end: Int) {
var left = start
var right = end
while left < right, right < chars.count {
(chars[left], chars[right]) = (chars[right], chars[left])
left += 1
right -= 1
}
}
题目3: 28. 实现 strStr()
文章&讲解
KMP的算法需要再多理解理解。