(数组与矩阵) 剑指 Offer 50. 第一个只出现一次的字符 ——【Leetcode每日一题】
发布人:shili8
发布时间:2025-01-22 16:55
阅读次数:0
**剑指 Offer50. 第一个只出现一次的字符**
**问题描述**
给定一个仅包含小写字母的字符串 `s` 和一个非空字母表 `letters`。返回在 `s` 中第一个只出现一次的字母。
**示例1:**
输入:`s = "leetcode"`、`letters = ['o', 'l', 'e', 't', 'c']`
输出:`'l'`
**示例2:**
输入:`s = "aabbcc"`、`letters = ['a', 'b', 'c']`
输出:`''` (如果不存在只出现一次的字母,则返回空字符串)
**限制条件**
* `1 <= s.length <=7` (长度不超过7)
* `0 <= letters.length <=26` (字母表中字母数量不超过26)
* `s` 和 `letters` 中的所有字符都是小写字母**解决方案**
### 方法一:哈希表我们可以使用一个哈希表来存储每个字母在字符串 `s` 中出现的次数。然后,遍历哈希表,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 哈希表:字母为键,出现次数为值 count = {} # 统计每个字母在 s 中出现的次数 for char in s: if char in count: count[char] +=1 else: count[char] =1 # 遍历哈希表,找到第一个只出现一次的字母 for letter in letters: if letter in count and count[letter] ==1: return letter # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法二:数组我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 遍历数组,找到第一个只出现一次的字母 for letter in letters: if 'a' <= letter <= 'z': index = ord(letter) - ord('a') if count[index] ==1: return letter # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法三:计数器我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 遍历数组,找到第一个只出现一次的字母 for letter in letters: if 'a' <= letter <= 'z': index = ord(letter) - ord('a') if count[index] ==1: return letter # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法四:二分查找我们可以使用二分查找来找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 二分查找:找到第一个只出现一次的字母 left, right =0, len(count) -1 while left <= right: mid = (left + right) //2 if count[mid] ==1: return chr(ord('a') + mid) elif count[mid] >1: right = mid -1 else: left = mid +1 # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法五:栈我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 遍历数组,找到第一个只出现一次的字母 stack = [] for letter in letters: if 'a' <= letter <= 'z': index = ord(letter) - ord('a') if count[index] ==1: return letter else: stack.append(letter) # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法六:队列我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 遍历数组,找到第一个只出现一次的字母 queue = [] for letter in letters: if 'a' <= letter <= 'z': index = ord(letter) - ord('a') if count[index] ==1: return letter else: queue.append(letter) # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法七:树我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: if 'a' <= char <= 'z': index = ord(char) - ord('a') count[index] +=1 # 遍历数组,找到第一个只出现一次的字母 tree = {} for letter in letters: if 'a' <= letter <= 'z': index = ord(letter) - ord('a') if count[index] ==1: return letter else: tree[letter] = True # 如果不存在只出现一次的字母,则返回空字符串 return ''
### 方法八:图我们可以使用一个长度为26 的数组来存储每个字母在字符串 `s` 中出现的次数。然后,遍历数组,找到第一个只出现一次的字母。
def firstUniqChar(s: str, letters: list) -> str: # 数组:字母表中字母对应的索引为下标,出现次数为值 count = [0] *26 # 统计每个字母在 s 中出现的次数 for char in s: