leetcode
leetcode 1801 ~ 1850
句子中的有效单词数

句子中的有效单词数

难度:

标签:

题目描述

代码结果

运行时间: 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值范围来判断字符是数字而不是直接使用字符比较?
使用ASCII值范围来判断字符是否是数字提供了一种更为底层和通用的方法,这使得该逻辑在不同的编程环境中更容易理解和维护。此外,进行ASCII值范围比较可以在没有直接字符比较支持的环境中使用,增加代码的兼容性。然而,在大多数现代编程语言中,直接使用字符比较(如 '0' <= c <= '9')通常更直观且易读。
🦆
在检测连字符时,如果遇到多于一个连字符会立即减少`ans`的值,这种处理方式是否会导致对同一个token的有效性判断多次减值?
是的,当前的逻辑在遇到第二个连字符后会立即减少`ans`的值,并终止当前token的检查。这确保了即使token中包含多个连字符,`ans`的值也只会因该token减少一次。因此,这个处理方式不会导致对同一个token的有效性判断多次减值。
🦆
在处理连字符逻辑中,如果连字符在第二个位置或倒数第二个位置,且其一侧不是小写字母,这种情况是否被正确处理?
是的,该逻辑被正确处理。代码中对连字符的位置进行了检查,如果连字符位于token的开头或结尾,则判断为无效单词。如果连字符位于其他位置,代码还会检查连字符两侧是否都是小写字母。因此,如果连字符在第二个位置或倒数第二个位置,且其一侧不是小写字母,该token会被正确地判断为无效单词。
🦆
代码中对于标点符号的检查似乎忽略了可能存在的多个标点符号的情况。请问这是否意味着如果一个token中有多个标点但只有一个不在末尾,这个token仍然算作有效单词?
是的,根据当前代码逻辑,如果一个token中有多个标点符号但只有最后一个位于末尾,则该token被视为有效单词。这是因为代码中的标点检查只关注标点是否出现在非末尾位置。如果出现非末尾的标点,会直接判断token为无效,而不会进一步检测是否还有其他标点。这可能是一个潜在的代码漏洞,应该加强对多个标点的检查。

相关问题