Easy
题目描述
给定一个字符串 s,返回字符串中的段数。
段被定义为连续的非空格字符序列。
示例 1:
输入:s = "Hello, my name is John"
输出:5
解释:五个段为 ["Hello,", "my", "name", "is", "John"]
示例 2:
输入:s = "Hello"
输出:1
约束条件:
0 <= s.length <= 300s由小写和大写英文字母、数字或以下字符之一组成:"!@#$%^&*()_+-=’,.:""s中唯一的空格字符是' '
解题思路
这是一个字符串处理问题,需要统计由空格分隔的非空字符段的数量。
思路分析:
主要有三种解法:
内置函数法:利用语言内置的字符串分割功能,分割后统计非空段的数量。这是最简洁的方法。
双指针遍历法:使用双指针找到每个非空字符段的起始和结束位置,然后计数。
状态标记法:遍历字符串,用布尔变量标记当前是否在一个段内。当从空格转换到非空格字符时,段数加一。
推荐解法:内置函数法最简洁高效,代码可读性强。对于这类简单的字符串处理问题,优先使用语言提供的内置功能。
需要注意的边界情况:
- 空字符串返回0
- 只包含空格的字符串返回0
- 字符串开头或结尾有多个空格的情况
代码实现
class Solution {
public:
int countSegments(string s) {
int count = 0;
bool inSegment = false;
for (char c : s) {
if (c != ' ') {
if (!inSegment) {
count++;
inSegment = true;
}
} else {
inSegment = false;
}
}
return count;
}
};
class Solution:
def countSegments(self, s: str) -> int:
return len(s.split())
public class Solution {
public int CountSegments(string s) {
return s.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
}
}
/**
* @param {string} s
* @return {number}
*/
var countSegments = function(s) {
return s.trim().split(/\s+/).filter(segment => segment.length > 0).length;
};
复杂度分析
| 方法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 内置函数法 | O(n) | O(n) |
| 状态标记法 | O(n) | O(1) |
其中 n 为字符串长度。内置函数法需要额外空间存储分割后的字符串数组,而状态标记法只需要常数空间。