leetcode题解434-字符串中的单词数(双指针经典)

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,进行下一个单词的处理
leetcode题解434-字符串中的单词数(双指针经典)_第1张图片
但是本题坑点比较多,可能两个字符串之间有多个空格,那么我们还需要一个循环,让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),

你可能感兴趣的:(leetcode,程序设计与算法,Java,leetcode,算法,java)