返回
每日一道算法题:面试题01.01. 判定字符是否唯一
Android
2023-09-06 23:08:43
题目
给定一个字符串,请判断字符串中是否有重复字符。
字符串只包含 ASCII 表中大写或小写的字母。
示例 1:
输入:s = "leetcode"
输出:false
示例 2:
输入:s = "abc"
输出:true
提示:
1 <= s.length <= 104
s
只包含 ASCII 表中大写或小写的字母
解题思路
1. 集合
集合是一种数据结构,可以存储唯一元素。我们可以将字符串中的每个字符作为集合的元素,如果集合中存在重复元素,则说明字符串中存在重复字符。
def is_unique(s):
"""
判断字符串中是否有重复字符
Args:
s: 字符串
Returns:
布尔值,True 表示字符串中没有重复字符,False 表示字符串中存在重复字符
"""
# 创建一个集合
char_set = set()
# 遍历字符串中的每个字符
for char in s:
# 如果字符不在集合中,则将字符添加到集合中
if char not in char_set:
char_set.add(char)
# 如果字符已经在集合中,则说明字符串中存在重复字符
else:
return False
# 如果集合中没有重复字符,则说明字符串中没有重复字符
return True
2. 散列表
散列表是一种数据结构,可以根据键值快速查找元素。我们可以将字符串中的每个字符作为散列表的键,如果散列表中存在重复键,则说明字符串中存在重复字符。
def is_unique(s):
"""
判断字符串中是否有重复字符
Args:
s: 字符串
Returns:
布尔值,True 表示字符串中没有重复字符,False 表示字符串中存在重复字符
"""
# 创建一个散列表
char_dict = {}
# 遍历字符串中的每个字符
for char in s:
# 如果字符不在散列表中,则将字符添加到散列表中
if char not in char_dict:
char_dict[char] = 1
# 如果字符已经在散列表中,则说明字符串中存在重复字符
else:
return False
# 如果散列表中没有重复键,则说明字符串中没有重复字符
return True
3. 位运算
位运算是一种计算机操作,可以对二进制位进行操作。我们可以使用位运算来判断字符串中是否有重复字符。
def is_unique(s):
"""
判断字符串中是否有重复字符
Args:
s: 字符串
Returns:
布尔值,True 表示字符串中没有重复字符,False 表示字符串中存在重复字符
"""
# 创建一个整型变量,用于存储字符串中出现的字符
char_bitmap = 0
# 遍历字符串中的每个字符
for char in s:
# 将字符转换为 ASCII 码
ascii_code = ord(char)
# 将 ASCII 码对应的位设置为 1
char_bitmap |= (1 << ascii_code)
# 如果字符已经出现过,则说明字符串中存在重复字符
if char_bitmap & (1 << ascii_code) > 1:
return False
# 如果字符串中没有重复字符,则返回 True
return True
比较
以下是对三种解题方法的比较:
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
集合 | O(n) | O(n) |
散列表 | O(n) | O(n) |
位运算 | O(n) | O(1) |
从比较中可以看出,位运算的解法在时间复杂度和空间复杂度上都优于集合和散列表的解法。但是,位运算的解法只适用于 ASCII 字符集。如果字符串中包含非 ASCII 字符,则需要使用集合或散列表的解法。
总结
这篇文章介绍了三种不同的解题思路来解决 LeetCode 题库中的第 1 题:面试题 01.01. 判定字符是否唯一。我们对每种方法进行了分析和比较,并给出了相应的代码示例。希望这篇文章能对您有所帮助。