当前位置:实例文章 » 其他实例» [文章](数组与矩阵) 剑指 Offer 50. 第一个只出现一次的字符 ——【Leetcode每日一题】

(数组与矩阵) 剑指 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:

其他信息

其他资源

Top