返回
剑指 Offer 50. 第一个只出现一次的字符
闲谈
2023-12-24 04:53:03
你知道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 螺旋创作器的其他文章。