算法 - 字符串02(Swift版本)

76 阅读1分钟

题目1:151.翻转字符串里的单词

leetcode

文章&讲解

思考:

  1. 字符串单词翻转 可以转化为 用字符串整体翻转 + 每个单词再次翻转。
  2. 移除空格 可以联想到移除元素的 双指针方式进行处理。
// @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()

leetcode

文章&讲解
KMP的算法需要再多理解理解。

题目4:459.重复的子字符串

leetcode

文章&讲解

总结

字符串总结
双指针总结