持续创作,加速成长!这是我参与「掘金日新计划 · 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
}
}
复杂度分析
-
时间复杂度:,只需要遍历一遍字符串检测每个下标即可。
-
空间复杂度:。
方法二:分割法
思路及解法
对于这种简单题,明显是要考查对边界条件的考虑,比如给定的字符串可能开头有空格、中间有连续的空格,结尾有空格,等等。
我们最保险的做法就是先调用库函数按空格分割字符串,再判断每个字符串本身是不是等于空字符串。
代码
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
}
}
复杂度分析
-
时间复杂度:, 为字符串的长度,主要是分割的时候会遍历字符串。
-
空间复杂度:, 为分割后返回的字符串数量,不是与 成正比,比如给定一个没有空格的字符串。