1.问题描述
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。
2.解题思路
统计单词次数可以使用双指针法
大雪菜老师给出的模板如下
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具体问题的逻辑
}
而对于本题的一个序列,用两个指针维护一段区间。用i指针来对整个字符串进行扫描,我们保证每次循环的时候,i指向字符串单词的第一个位置,而j指针则从i指针的位置开始,找到字符串单词的最后一个位置。字符串单词的最后一个位置即找到str[i]==’ ’ 为止, 当我们本个单词处理完之后,让i=j,进行下一个单词的处理
但是本题坑点比较多,可能两个字符串之间有多个空格,那么我们还需要一个循环,让j跨越中间的所有空格。
另外,字符串的开头也可能是空格,因此我们每次还需要判断在j遇到空格退出这之间有没有经过非空格的字符。
具体代码如下:
3.实现代码
class Solution {
public int countSegments(String s) {
int len=s.length();
int count=0; //单词数
for(int i=0;i<len;i++){
int j=i;
//当遇到了空格即停止
while(j<len && s.charAt(j)!=' '){
j++;
}
if(j>i){
//表明有不为空格的字符存在,就可以组成一个单词
count++;
}
//跨越中间可能存在的多个空格
while(j+1<len &&s.charAt(j+1)==' '){
j++;
}
if(j==len-1){
break;
}
i=j;
}
return count;
}
}
4.总结
双指针算法的核心思想是把从i,j两重循环中挖取某些性质,可以只让我们枚举O(n)个状态,把我们的时间复杂度从O(n2)变成O(n),