「JavaScript」字符个数统计「哈希」🔢

算法思路

本题要求统计字符串中不同字符的个数,字符的范围限定在 ASCII 码的 0 到 127(包括 0 和 127)。需要注意的是:

  1. 字符串中的换行符不算在字符内。
  2. 字符范围限定为 0 到 127,其他字符不作统计。
  3. 多个相同的字符只计算一次。

为了高效解决这个问题,我们可以利用 哈希表(或 JavaScript 中的 Set 集合)来存储已经出现过的字符。哈希表可以帮助我们快速判断字符是否已经出现过,从而避免重复计数。

步骤:

  1. 初始化一个 Set 集合,用于存储出现过的字符。
  2. 遍历输入的字符串,对于每个字符,如果它在 ASCII 范围内(0-127),就将其加入到集合中。
  3. 最后,集合中的元素数量即为不同字符的个数。

Code

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // 读取输入字符串
    const str = await readline();
    
    // 创建一个 Set 来存储不同的字符
    const uniqueChars = new Set();
    
    // 遍历字符串中的每个字符
    for (let char of str) {
        // 获取字符的 ASCII 码
        const charCode = char.charCodeAt(0);
        
        // 如果字符的 ASCII 码在 0 到 127 之间,才统计
        if (charCode >= 0 && charCode <= 127) {
            uniqueChars.add(char); // 将字符加入 Set 集合中
        }
    }
    
    // 输出不同字符的数量
    console.log(uniqueChars.size);
}()

复杂度分析

  • 时间复杂度: O(n),其中 n 是字符串的长度。我们只需要遍历一次字符串,检查每个字符是否在 ASCII 范围内,并将其加入到集合中,整个过程的时间复杂度为 O(n)。
  • 空间复杂度: O(k),其中 k 是字符串中不同字符的个数。我们使用 Set 存储不同字符,最多存储 128 个字符(因为字符的 ASCII 范围是 0 到 127),所以空间复杂度为 O(k)。