Easy

题目描述

给定一个字符串 s,返回字符串中的段数。

段被定义为连续的非空格字符序列。

示例 1:

输入:s = "Hello, my name is John"
输出:5
解释:五个段为 ["Hello,", "my", "name", "is", "John"]

示例 2:

输入:s = "Hello"
输出:1

约束条件:

  • 0 <= s.length <= 300
  • s 由小写和大写英文字母、数字或以下字符之一组成:"!@#$%^&*()_+-=’,.:""
  • s 中唯一的空格字符是 ' '

解题思路

这是一个字符串处理问题,需要统计由空格分隔的非空字符段的数量。

思路分析:

主要有三种解法:

  1. 内置函数法:利用语言内置的字符串分割功能,分割后统计非空段的数量。这是最简洁的方法。

  2. 双指针遍历法:使用双指针找到每个非空字符段的起始和结束位置,然后计数。

  3. 状态标记法:遍历字符串,用布尔变量标记当前是否在一个段内。当从空格转换到非空格字符时,段数加一。

推荐解法:内置函数法最简洁高效,代码可读性强。对于这类简单的字符串处理问题,优先使用语言提供的内置功能。

需要注意的边界情况:

  • 空字符串返回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 为字符串长度。内置函数法需要额外空间存储分割后的字符串数组,而状态标记法只需要常数空间。