leetcode-434-字符串中的单词数
[博客链接]
[题目链接]
[github地址]
[题目描述]
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。
思路一:java原生函数
- 通过java原生函数做字符串分割
- 分割正则位
+
,表示至少一个空格 - 将所有空字符串排除可以是O(n)级别的操作也可以是O(1)级别的操作
- 只判断第一个字符串是否为空即可
- 最后返回不为空的字符串数量
public int countSegments(String s) {
String[] arr = s.split(" +");
int res = 0;
for (String str:arr
) {
if (!"".equals(str)){
res++;
}
}
return res;
}
- 时间复杂度O(n),n为字符串长度
- 时间复杂度O(n)
思路二:双指针
- 定义两个指针
- l指针负责记录头部
- r指针记录尾部,并标记l指针的下一次遍历开始位置
- 当l遍历到第一个非空字符开始寻找单词结尾,用r来进行标记
- 为了方便运算,我们将输入字符做扩展处理,在字符结尾加入空格
- 方便边界结算
public int countSegments(String s) {
StringBuilder sb = new StringBuilder(s);
sb.append(" ");
int l = 0, res = 0;
while (l < sb.length()) {
while (l < sb.length() && sb.charAt(l) == ' ') {
l++;
}
int r = l + 1;
while (r < sb.length()) {
if (sb.charAt(r) == ' ') {
l = r;
res++;
break;
}
r++;
}
}
return res;
}
- 时间复杂度O(n),n为字符串长度
- 时间复杂度O(n)