2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > leetcode题解434-字符串中的单词数(双指针经典)

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

时间:2019-04-28 18:53:06

相关推荐

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,进行下一个单词的处理

但是本题坑点比较多,可能两个字符串之间有多个空格,那么我们还需要一个循环,让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),

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。