返回

剑指 Offer 50. 第一个只出现一次的字符

闲谈

你知道LeetCode中一个经典的字符串问题吗?它就是《剑指 Offer 50. 第一个只出现一次的字符》,一个考验我们编程功底和算法思维的问题。今天,我们就一起来探讨一下这个题目。

题目

LeetCode《剑指 Offer 50. 第一个只出现一次的字符》题目如下:

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例:

输入: "leetcode"
输出: 0

提示:

* 你可以假定该字符串只包含小写字母。

核心代码

为了解决这个问题,我们可以使用两种解法:暴力法和哈希表法。

暴力法

暴力法是一种最直接的解法,它通过遍历字符串中的每一个字符,并检查它是否在字符串的其余部分中出现。如果它没有出现,则它就是第一个不重复的字符。以下是暴力法实现的Python代码:

def firstUniqChar(s):
    """
    暴力法寻找字符串中第一个不重复的字符
    :param s: 输入字符串
    :return: 第一个不重复的字符的索引,如果不存在则返回 -1
    """
    for i in range(len(s)):
        if s[i] not in s[i+1:]:
            return i
    return -1

哈希表法

哈希表法是一种更高效的解法,它通过使用哈希表来存储字符串中出现过的字符和它们的出现次数。然后,我们可以遍历哈希表,找到出现次数为 1 的第一个字符,并返回它的索引。以下是哈希表法实现的Python代码:

def firstUniqChar(s):
    """
    哈希表法寻找字符串中第一个不重复的字符
    :param s: 输入字符串
    :return: 第一个不重复的字符的索引,如果不存在则返回 -1
    """
    char_dict = {}
    for char in s:
        if char not in char_dict:
            char_dict[char] = 0
        char_dict[char] += 1

    for i in range(len(s)):
        if char_dict[s[i]] == 1:
            return i
    return -1

另一解法

除了暴力法和哈希表法之外,还有一种更加巧妙的解法,称为“滑动窗口”法。这种方法使用两个指针来定义一个滑动窗口,并遍历字符串。当窗口中的字符不重复时,窗口就向右移动。当窗口中的字符出现重复时,窗口就向左移动,直到窗口中的字符不重复为止。以下是“滑动窗口”法实现的Python代码:

def firstUniqChar(s):
    """
    滑动窗口法寻找字符串中第一个不重复的字符
    :param s: 输入字符串
    :return: 第一个不重复的字符的索引,如果不存在则返回 -1
    """
    left = 0
    right = 0
    char_set = set()

    while right < len(s):
        if s[right] not in char_set:
            char_set.add(s[right])
            right += 1
        else:
            char_set.remove(s[left])
            left += 1

    if left == right:
        return -1
    else:
        return left

解题思路

对于这道题目,我们可以使用暴力法、哈希表法和“滑动窗口”法这三种方法来解决。其中,“滑动窗口”法是一种更加巧妙的解法,因为它可以在时间复杂度为 O(n) 的情况下解决这个问题。

希望通过这篇文章,你对《剑指 Offer 50. 第一个只出现一次的字符》这道题目有了更深入的了解。如果你想了解更多关于算法和数据结构的知识,欢迎继续阅读 AI 螺旋创作器的其他文章。