统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

输入: “Hello, my name is John”
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 “Hello,” 算作 1 个单词。

拿到这题的时候我写的是这种写法

class Solution { 
    public int countSegments(String s) { 
    int count=0;

    for(int i=0;i<s.length();){ 

        while(s.charAt(i)!=' '&&i<s.length()){ 
            i++;
        }
        count++;
       

    }
    return count;
    }
}

只是这种写法提示时间超出限制
后来去看了题解之后,进行了更改

class Solution { 
    public int countSegments(String s) { 
    int count=0;

    for(int i=0;i<s.length();i++){ 

        if ((i == 0 || s.charAt(i-1) == ' ') && s.charAt(i) != ' ') { 
                count++;
            }

    }
    return count;
    }
}

猜测是while循环使用不恰当导致的,以后注意
附上题解中给这种思路的解释:
计算单词的数量,就等同于计数单词开始的下标个数。因此,只需要定义好下标的条件,就可以遍历整个字符串,检测每个下标。定义如下:若该下标前为空格(或者为初始下标),且自身不为空格,则其为单词开始的下标。该条件可以以常数时间检测。最后,返回满足条件的下标个数。

内置函数解法

此外题解中还提到了使用内置方法的解法
本问题有一些边缘情况需要考虑,至少在Java中如此。首先,开头的一个或多个空格会导致 split 函数在字符串开头产生一个错误的 “”,因此我们使用内置的 trim 函数来移除这些空格。其次,如果结果为空字符串,可以直接输出 0。由于 split 函数的下述特性,这一点很重要:

String[] tokens = “”.split(“\s++”);
tokens.length; // 1
tokens[0]; // “”

当抵达最后的 return 语句,我们将修整过的字符串以一个或多个空格字符切分(split 函数可以使用正则表达式),并返回结果数组的长度。

用 Python 写的代码要短很多,这是由于 Python 的 split 函数和 Java 相比有很多不同之处,更加适合此类问题。值得注意的是,当对空字符串使用 split 时,会返回空数组。这是由于 Python 会在 split 之前隐式地调用 trim (在Python lingo 中是 strip)。

class Solution { 
    public int countSegments(String s) { 
        String trimmed = s.trim();
        if (trimmed.equals("")) { 
            return 0;
        }
        return trimmed.split("\\s+").length;
    }
}


代码中的trim的作用是去除掉边缘的空格,比如首部的空格
split函数的作用是将字符串依据规则分割成字符串数组
这里的”\\s+”的含义需要分开来理解,\\s的含义是空格,回车,换行等空白符, 而+的含义是表示一个或多个的意思。所以结合起来看就是以一个或多个空格来作为标志去分割字符串。

作者:LeetCode
链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string/solution/zi-fu-chuan-zhong-de-dan-ci-shu-by-leetcode/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本文地址:https://blog.csdn.net/weixin_46428711/article/details/110866521