leetcode刷题---字符串---字符串中的单词数
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: “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
上一篇: 网络聊天
推荐阅读