句子中的有效单词数
难度:
标签:
题目描述
代码结果
运行时间: 34 ms, 内存: 16.2 MB
/*
* 思路:
* 1. 将句子按照空格分割成多个token。
* 2. 使用Java Stream对每个token进行验证,验证规则如下:
* a. 仅由小写字母、连字符和/或标点(不含数字)组成。
* b. 至多一个连字符,且连字符两侧应当都存在小写字母。
* c. 至多一个标点符号,且标点符号应当位于token的末尾。
* 3. 统计所有满足上述条件的有效单词的数量。
*/
import java.util.Arrays;
public class ValidWordsCounterStream {
public int countValidWords(String sentence) {
return (int) Arrays.stream(sentence.split("\s+"))
.filter(token -> token.matches("^[a-z]+(-[a-z]+)?[!.,]?$"))
.count();
}
public static void main(String[] args) {
ValidWordsCounterStream counter = new ValidWordsCounterStream();
System.out.println(counter.countValidWords("cat and dog")); // 输出: 3
System.out.println(counter.countValidWords("!this 1-s b8d!")); // 输出: 0
System.out.println(counter.countValidWords("alice and bob are playing stone-game10")); // 输出: 5
}
}
解释
方法:
解题思路主要是通过检查每一个token是否满足有效单词的定义。首先,使用split()方法将句子分割成token列表。然后,对每个token逐个进行检查,以判断其是否为有效单词。有效单词的条件包括:不包含数字,至多包含一个连字符(连字符必须位于两个小写字母之间),以及至多一个位于token末尾的标点符号。具体的检查过程是通过遍历每个token中的每个字符,并根据字符的类型(数字、连字符或标点符号)进行相应的检查。如果发现token不符合有效单词的标准,则从总数中减去一个计数。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在检查每个字符时,使用ASCII值范围来判断字符是数字而不是直接使用字符比较?
▷🦆
在检测连字符时,如果遇到多于一个连字符会立即减少`ans`的值,这种处理方式是否会导致对同一个token的有效性判断多次减值?
▷🦆
在处理连字符逻辑中,如果连字符在第二个位置或倒数第二个位置,且其一侧不是小写字母,这种情况是否被正确处理?
▷🦆
代码中对于标点符号的检查似乎忽略了可能存在的多个标点符号的情况。请问这是否意味着如果一个token中有多个标点但只有一个不在末尾,这个token仍然算作有效单词?
▷