C++ 中检查给定字符串是否为全字母句

2025 年 5 月 22 日 | 5 分钟阅读

一个异构词是一个单词、短语或句子,其中不重复使用任何字母。这是语言学领域的一个好主意,并且在计算语言学领域和谜语部分也将有很好的用途。有许多异构词,例如“playground”和“background”,因为每个字母都只出现一次;而不符合异构词定义的例子是“hello”,因为字母“l”出现了两次。

本文讨论了使用C++确定给定字符串中异构词的技术。我们将把问题分解成小而简单的部分,回顾几种不同的情况,然后制定一个包罗万象的C++ 程序来解决这个问题。因此,通过阅读所有章节,我们将了解如何为这个问题制定一个高质量的解决方案,并学习一些最基本的编程概念。

分解问题

为了确定一个字符串是否是异构词,我们必须检查是否有任何字符出现不止一次。字符串可以由以下组成:

  1. 字母字符(大写和小写)。
  2. 非字母字符,如数字、空格和标点符号。
  3. 混合字符。

我们的方法将只关注字母字符,并忽略大小写差异、空格和标点符号。

解决问题的关键步骤

  1. 输入规范化
    • 将所有字母字符转换为小写。
    • 忽略非字母字符。
  2. 字符追踪
    • 使用数据结构来跟踪已经遇到的字符。
    • 如果一个字符出现不止一次,则该字符串不是异构词。
  3. 输出结果
    • 如果没有字符重复,则该字符串是异构词;否则不是。

C++ 中的实现

让我们一步一步地在 C++ 中实现解决方案。

1. 使用布尔数组

跟踪字符出现的最简单有效的方法是使用布尔数组。这个数组将有 26 个元素,每个元素对应一个英文字母。当遇到一个字符时,它在数组中对应的索引被标记为 true。如果我们再次遇到相同的字符,我们可以得出结论,该字符串不是异构词。

这是实现

输出

Enter a string to check if it is a Heterogram: 25
"25" is a Heterogram.
Enter a string to check if it is a Heterogram: This is tTechPoint
"This is tTechPoint" is NOT a Heterogram.    

2. 代码如何工作

  • 输入字符串逐字符处理。
  • 每个字母字符都使用 tolower() 转换为小写。
  • 布尔数组 charPresence 用于跟踪已遇到的字母。
  • 如果再次遇到某个字母,函数会立即返回 false。

详细示例演练

输入:“Lamp”

  1. 转换为小写:“lamp”。
  2. 处理每个字符
    • ‘l’:将数组中索引 11 标记为 true。
    • ‘a’:将索引 0 标记为 true。
    • ‘m’:将索引 12 标记为 true。
    • ‘p’:将索引 15 标记为 true。
  3. 未找到重复项。输出:异构词。

输入:“Hello”

  1. 转换为小写:“hello”。
  2. 处理每个字符
    • ‘h’:将数组中索引 7 标记为 true。
    • ‘e’:将索引 4 标记为 true。
    • ‘l’:将索引 11 标记为 true。
    • 第二个‘l’:索引 11 已为 true。检测到重复。
  3. 输出:不是异构词

优化和替代方法

1. 使用无序集合

unordered_set 也可以用来跟踪遇到的字符。这种方法提供了简洁性和灵活性。

2. 忽略非字母字符

如果字符串可能包含空格或标点符号,则在过滤掉非字母字符后应用相同的逻辑。上述代码通过检查 isalpha(ch) 已经处理了这种情况。

3. 国际化

对于非英文字母或 Unicode 字符串,我们可能需要使用 ICU 等库来处理 ASCII 以外的字符。

复杂度分析

1. 时间复杂度

  • 处理每个字符:O(n),其中 n 是字符串的长度。
  • 数组或集合操作:O(1) 平均。

总时间复杂度:O(n)。

2. 空间复杂度

  • 布尔数组: O(1)(英文字母的固定大小)。
  • 无序集合: O(k),其中 k 是唯一字母的数量。

异构词检查的应用

  1. 游戏和谜题
    • 拼字游戏或填字游戏等文字游戏可以使用异构词来过滤有效单词。
  2. 数据验证
    • 它确保字符串中的唯一标识符。
  3. 语言学
    • 在自然语言处理中分析文本属性。

结论

总之,检查给定的字符串是否是异构词是一个有趣的问题,它展示了基本数据结构和逻辑思维的使用。所提供的 C++ 解决方案高效且适用于各种场景。通过使用布尔数组或无序集合,我们可以确保算法以线性时间运行,并具有最小的空间开销。这个问题还提供了练习处理字符串、字符处理和利用 C++ 中数据结构的绝佳机会。