Swift - LeetCode - 字符串中的单词数

420 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

题目

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例 1:

  • 输入: "Hello, my name is John"
  • 输出: 5
  • 解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。

方法一:原地法

思路及解法

计算字符串中单词的数量,就等同于计数单词的第一个下标的个数。因此,我们只需要遍历整个字符串,统计每个单词的第一个下标的数目即可。

满足单词的第一个下标有以下两个条件:

  • 该下标对应的字符不为空格;

  • 该下标为初始下标或者该下标的前下标对应的字符为空格;

代码

class Solution {
    func countSegments(_ s: String) -> Int {
        let array: [Character] = Array(s)
        var segmentCount: Int = 0
        for i in 0..<array.count {
            if (i == 0 || array[i - 1] == " ") && array[i] != " " {
                segmentCount += 1
            }
        }
        return segmentCount
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),只需要遍历一遍字符串检测每个下标即可。

  • 空间复杂度:O(1)O(1)

方法二:分割法

思路及解法

对于这种简单题,明显是要考查对边界条件的考虑,比如给定的字符串可能开头有空格、中间有连续的空格,结尾有空格,等等。

我们最保险的做法就是先调用库函数按空格分割字符串,再判断每个字符串本身是不是等于空字符串。

代码

class Solution {
    func countSegments(_ s: String) -> Int {
        let array: [Substring] = s.split(separator: " ")
        var segmentCount: Int = 0
        for string in array {
            if string != " " {
                segmentCount += 1
            }
        }
        return segmentCount
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n)nn 为字符串的长度,主要是分割的时候会遍历字符串。

  • 空间复杂度:O(x)O(x)xx 为分割后返回的字符串数量,不是与 nn 成正比,比如给定一个没有空格的字符串。