字符串中的第一个唯一字符 Python

2024 年 8 月 29 日 | 阅读 6 分钟

本教程将展示查找给定字符串的第一个唯一字符的各种方法。例如,如果给定字符串是“stringstutorial”,则结果应为“n”,如果给定字符串是“StringsTutorial”,则结果应为“S”。

说明

输入:“stringstutorial”

说明

步骤 1:为给定字符串创建字符频率列表

freq['s'] = 2

freq['t'] = 3

freq['r'] = 2

freq['i'] = 2

freq['n'] = 1

freq['g'] = 1

freq['u'] = 1

freq['o'] = 1

freq['a'] = 1

freq['l'] = 1

步骤 2:查找频率为单位的第一个字符。

创建频率哈希图

如果一个字符在给定字符串中只出现一次,则认为它是非重复字符。定位此类唯一字符的步骤是计算字符串序列中每个字母的频率,并确定哪个字母的频率为 1。哈希图是一种有效的工具,它可以将字符映射到其对应的频率,使我们能够以恒定的时间同时修改我们已经遇到的字符的频率。在 ASCII 系统中,256 个唯一字符是限制。因此,哈希图的最大长度为 256。重新读取字符串,频率等于一的第一个字母就是答案。

算法

  1. 创建一个哈希图,将每个字符与其频率关联起来。
  2. 使用指针遍历输入字符串。
  3. 修改哈希图中当前存在的字符数量。
  4. 接下来,再次遍历字符串,确定当前字符的频率是否为 1。
  5. 如果频率大于 1,则继续遍历。
  6. 否则,结束循环并将当前字符输出为答案。

代码

输出

The first unique character is n

仅遍历一次字符串查找唯一字符

主要方法需要 O(n) 的运行时间,尽管我们可以在应用程序中使其更快。计数数组在过程的第一步中通过 O(n) 的运行时间迭代遍历文本来构建。这一步是合理的。但是,第二部分,即我们重放字符串的第一个非重复项,并不是一个好主意。

在实际情况下,字符串通常比我们的字符集长得多。考虑 DNA 序列,它们可能有数十亿个字母,但只有一个四字母字母表。如果唯一字符位于字符串的末尾,会发生什么?然后,它将需要很长的扫描。

创建哈希图并仅遍历字符串一次

不要使用哈希图,而是创建一个长度为 256 的频率数组,该长度等于字符列表的长度。通过向频率数组添加信息,我们可以存储不仅频率,还可以存储字母首次出现的位置,例如字母的 (5, 36),表示它被记录了五次,最初出现在位置 36。为了找到第一个唯一字符,我们只需要扫描频率数组而不是字符串。下面是这个想法的实现。

代码

输出

First unique character is n

创建频率列表并仅循环一次

创建最多 256 个字符的频率列表。我们可以将此列表中的所有项初始化为 -1。我们将迭代字符串中的字符,并检查此特定字符的列表元素是否索引为 1。如果结果为 -1,我们将将其更改为 j;如果结果不是 -1,则表示该字符已被使用;在这种情况下,我们将将其更改为 -2。

所有重复的字符最终都将被更改为 -2,而所有唯一的字符仍将保留它们首次出现的索引。通过迭代所有唯一的字符,我们可以快速找到最小或初始索引。

代码

输出

The first unique character is n

使用 Python 的内置函数

利用 Counter() 函数确定所有字符的频率。

遍历字符串并查找频率为 1 的元素。打印唯一字符并在此处中断循环。

代码

输出

The first unique character is: n

使用字符串的 find() 函数

在当前字母之后,查找每个后续字母。如果返回 -1,则表示该字母只出现一次,即当前索引。

代码

输出

The first unique character is: n

使用 count() 函数

如果一个字符在字符串中的 count() 为 1,则表示该字符是唯一的且未重复。我们将中断循环并打印找到的第一个唯一字符。

代码

输出

The first unique character is n