📌  相关文章
📜  由非重复字符组成的给定字符串(1)

📅  最后修改于: 2023-12-03 15:11:20.302000             🧑  作者: Mango

由非重复字符组成的给定字符串

在程序设计中,有时需要处理由非重复字符组成的给定字符串,这种字符串被称为“非重复字符串”。本文将介绍如何判断字符串中是否有重复字符,以及如何找出最长的非重复字符子串。

判断字符串中是否有重复字符

判断字符串中是否有重复字符,可以使用哈希集合的方法。具体步骤如下:

  1. 创建一个空的哈希集合。
  2. 遍历字符串的每个字符。
  3. 对每个字符,判断它是否在哈希集合中。
  4. 如果该字符已经在哈希集合中,说明字符串中存在重复字符;否则,把该字符加入哈希集合中。
  5. 如果遍历完字符串后没有发现重复字符,则字符串是非重复字符串。

以下是 Python 代码示例:

def has_duplicate_chars(s: str) -> bool:
    char_set = set()
    for c in s:
        if c in char_set:
            return True
        else:
            char_set.add(c)
    return False
找出最长的非重复字符子串

找出最长的非重复字符子串,可以使用滑动窗口的方法。具体步骤如下:

  1. 创建两个指针 leftright,分别指向滑动窗口的左右两端。
  2. 创建一个空的哈希集合 char_set,表示窗口中的字符集合。
  3. right 指向的字符不在 char_set 中时,把该字符加入 char_set 中,并把窗口右端右移一位。
  4. right 指向的字符已经在 char_set 中时,把左端右移一位,并把对应的字符从 char_set 中删除。
  5. 每次操作后,计算当前窗口的长度,并更新最长的非重复字符子串长度。
  6. 重复步骤 3-5 直到遍历完整个字符串。

以下是 Python 代码示例:

def longest_nonrepeat_substring(s: str) -> int:
    left, right = 0, 0
    char_set = set()
    max_len = 0
    while right < len(s):
        if s[right] not in char_set:
            char_set.add(s[right])
            right += 1
            max_len = max(max_len, right - left)
        else:
            char_set.remove(s[left])
            left += 1
    return max_len
总结

由非重复字符组成的给定字符串是程序设计中常见的一种数据结构。判断字符串中是否有重复字符和找出最长的非重复字符子串是解决这类问题的两个常见方法。本文提供了哈希集合和滑动窗口两种实现方式。