文章目录
题目
标题和出处
标题:字符串中的单词数
难度
3 级
题目描述
要求
给你字符串 s \texttt{s} s,返回字符串中的单词数。
单词指的是连续的不是空格的字符。
示例
示例 1:
输入:
s
=
"Hello,
my
name
is
John"
\texttt{s = "Hello, my name is John"}
s = "Hello, my name is John"
输出:
5
\texttt{5}
5
解释:五个单词是
["Hello,",
"my",
"name",
"is",
"John"]
\texttt{["Hello,", "my", "name", "is", "John"]}
["Hello,", "my", "name", "is", "John"]
示例 2:
输入:
s
=
"Hello"
\texttt{s = "Hello"}
s = "Hello"
输出:
1
\texttt{1}
1
示例 3:
输入:
s
=
"love
live!
mu’sic
forever"
\texttt{s = "love live! mu'sic forever"}
s = "love live! mu’sic forever"
输出:
4
\texttt{4}
4
示例 4:
输入:
s
=
""
\texttt{s = ""}
s = ""
输出:
0
\texttt{0}
0
数据范围
- 0 ≤ s.length ≤ 300 \texttt{0} \le \texttt{s.length} \le \texttt{300} 0≤s.length≤300
- s \texttt{s} s 包含大写和小写英语字母、数字以及以下字符: !@# \texttt{!@\#} !@#$ % ˆ &*()_+-=’,.: \texttt{\%\^ \&*()\_+-=',.:} % ˆ&*()_+-=’,.:
- 只有 ‘ ’ \texttt{` '} ‘ ’ 是空格
解法
思路和算法
字符串中的单词是连续的不是空格的字符,因此每个单词都对应一段连续的下标范围,即每个单词都有一个开始下标和一个结束下标。
任何单词的开始下标和结束下标处的字符一定不是空格,且满足以下条件:
-
开始下标为字符串开头,或者开始下标左边的一个位置处的字符是空格;
-
结束下标为字符串结尾,或者结束下标右边的一个位置处的字符是空格。
由于每个单词都有一个开始下标和一个结束下标,因此计算字符串中的单词数,等价于计算字符串中的开始下标数和结束下标数,只要遍历字符串,判断每个字符所在的下标是否为开始下标或结束下标即可。
以下解法通过计算字符串中的开始下标数的方式计算字符串中的单词数。
从左到右遍历字符串,当遇到一个不是空格的字符,且该字符位于下标 0 0 0 或者该字符左边的字符是空格时,则遇到的字符是一个位于开始下标的字符,将单词数加 1 1 1。遍历结束时,即可得到字符串中的单词数。
代码
class Solution {
public int countSegments(String s) {
int segments = 0;
int length = s.length();
for (int i = 0; i < length; i++) {
if ((i == 0 || s.charAt(i - 1) == ' ') && s.charAt(i) != ' ') {
segments++;
}
}
return segments;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 s s s 的长度。需要遍历字符串 s s s 一次。
-
空间复杂度: O ( 1 ) O(1) O(1)。