leetcode
leetcode 1601 ~ 1650
判断句子是否为全字母句

判断句子是否为全字母句

难度:

标签:

题目描述

代码结果

运行时间: 21 ms, 内存: 16.0 MB


/*
  * 思路:
  * 使用Java Stream API,我们可以利用字符流来高效地检查sentence是否是全字母句。
  * 我们首先将字符串转换为字符流,然后映射到对应的字符索引(0到25),
  * 然后通过distinct()去重并计数,如果计数结果是26,则返回true。
  */
import java.util.stream.IntStream;

public class Solution {
  public boolean checkIfPangram(String sentence) {
    // 将sentence转换为字符流,映射到0到25之间的索引,去重并计数
    long count = sentence.chars()
        .map(c -> c - 'a')
        .distinct()
        .count();

    // 如果不同字母数量为26,则是全字母句
    return count == 26;
  }
}

解释

方法:

该题解的核心思路是利用集合来去除字符串中的重复字符,并检查去重后的字符数量是否等于26。如果是,说明句子包含了英文字母表中的每个字母至少一次,因此是全字母句。使用集合是因为集合自动去重和高效的查找与插入能力。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么将输入字符串转换成集合后,只需检查集合的大小是否为26即可判断句子是否为全字母句?
英文字母表共有26个小写字母。当输入的字符串被转换为集合时,集合的性质会自动去除字符串中的重复字符,保留唯一的字符。因此,如果集合中的元素数量达到26,就说明输入的字符串至少包含了每一个英文字母一次,满足全字母句的条件。
🦆
集合在处理字符串时的去重功能是如何实现的,它背后的数据结构是什么?
在Python中,集合是基于哈希表实现的。当我们将字符串中的字符添加到集合中时,集合会使用哈希函数来计算每个元素的哈希值,并根据这个哈希值将元素存储在内部的数据结构中。如果新加入的元素与已存在的元素具有相同的哈希值(并且在比较后确认是相同的元素),则不会重复添加。这种基于哈希表的结构使得集合具有高效的查找和插入性能,从而实现快速去重。
🦆
在代码中 `return len(set(sentence)) == 26` 直接返回比较结果,这种实现方式有什么特别的效率优势吗?
这种实现方式的效率优势在于其简洁性和直接性。首先,通过直接构建集合并检测其大小,避免了额外的变量声明或复杂的逻辑判断步骤。其次,这种方式利用了Python语言的高级特性,减少代码量,提高可读性和维护性。从性能角度看,这种方式最大的优势在于一次性完成了去重和计数的操作,避免了多次遍历输入字符串。
🦆
如果输入的字符串包含了非小写英文字母的字符,这种方法还适用吗?
该方法仍然适用,因为集合会去除所有重复的字符,并只计算唯一字符的总数。如果包含非小写英文字母的字符,这些字符同样会被添加到集合中,但不会影响到集合中英文字母的数量统计。只要集合中小写英文字母的数量为26,无论是否包含其他字符,该方法都能正确判断句子是否为全字母句。

相关问题