【问题标题】:How to count how many different letters are in one text string? [duplicate]如何计算一个文本字符串中有多少个不同的字母? [复制]
【发布时间】:2014-10-17 07:52:54
【问题描述】:

如何计算一个文本字符串中有多少个不同的字母?

【问题讨论】:

  • Google 确定 C 字符串中不同字符的数量。浏览前 10 个链接以获取想法。根据你的发现实施一些东西。 (您至少必须尝试一些事情才能让答案对您有意义)

标签: c string diff letters


【解决方案1】:

实际上,这很简单:您只需跟踪字符串中已经遇到了哪些字符。

const char *str = "foo bar baz quirk qux";

bool found[1 << CHAR_BIT] = { 0 };

int n_distinct = 0;

for (const char *p = str; *p; p++) {
    unsigned char ch = *p;

    if (!found[ch]) {
        n_distinct++;
        found[ch] = 1;
    }
}

printf("Distinct characters: %d\n", n_distinct);

【讨论】:

  • +1 用于简单的n_distinct 计数。注意:在深奥系统中,sizeof(int)== sizeof(char) 那么1 &lt;&lt; CHAR_BIT 是UB。
  • @chux 完全正确,你建议我改用什么? (一开始我考虑过投射到(size_t)1,但同样,sizeof(size_t) == sizeof(char) 也有可能,所以......)
  • 如果sizeof(int)== sizeof(char)found[] 数组方法可能无法使用 - 数组太大了。但是对于CHAR_BIT 为 8(或 9)的合理系统,这是一个很好的方法。
  • @chux 同时,我们只希望 OP 使用一个合理的实现:P
【解决方案2】:

创建一个名为 uniqueLetters 的 char 数组和一个名为 currentLetter 的 char。创建一个 for 循环,将 currentLetter 一个一个地设置为字符串中的每个字符。在我描述的第一个循环中嵌套另一个 for 循环,检查 currentLetter 是否在 uniqueLetters 数组中。如果它不在 uniqueLetters 数组中,则将其添加到 uniqueLetters 数组中。最后计算 uniqueLetters 数组的长度。

要记住的一点是,“s”和“S”被视为不同的字符。如果要将它们计为相同的字母,则需要添加额外的逻辑来检查该字母的小写或大写版本是否存在于 uniqueLetter 数组中。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2021-12-26
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多