+

01.01.判定字符是否唯一

链接:https://leetcode-cn.com/problems/is-unique-lcci/
难度:简单

+

题目

+

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

+

示例 1:

+

输入: s = “leetcode”
输出: false
示例 2:

+

输入: s = “abc”
输出: true

+

限制:

+

0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。

+
+

思路

首先,你得理解题意。不确定的东西,需要问或者尝试验证。

+

比如:这里你可以问面试官字符串s是ASCII还是Unicode字符串,如果是编程平台你可以写测试来判断。

+

在这里我们假定字符集为ASCII,那如果字符串长度大于128,那肯定是false,不过有限制条件len(s)<=100,那这个判断就不必要了。限制里面还要求不使用额外的数据结构,这就过滤掉了很多的方案。

+

比如,使用set就一行代码解决

+
1
2
3
class Solution:
def isUnique(self, astr: str) -> bool:
return len(astr)== len(set(astr))
+ +

我们很容易想到hash计数的方法,经过测试,字符串中只出现’a’到’z’,26个小写字母,那只需要一个bool数组,直接统计出现的频率,判断是否重复。

+

考虑到不使用额外的数据结构,那我们可以尝试使用bitmap,把数组换成一个整型数,按照位上0,1来判断是否重复。

+

开始我们算出字符离最开始的字符’a’的距离,然后1移动这个距离来表示这个数。后面用一个测试变量来测试p,如果存在则返回False,如果不存在则写入。

+

具体代码:

+
def isUnique(self, astr: str) -> bool:
+    t = 0
+    for c in astr:
+        if t & (p := 1 << (ord(c) - ord('a'))):
+            return False
+        t |= p
+    return True

在解答中使用了Python3.8的新特性:海象运算符,点击下面的链接,学习使用它。
https://mp.weixin.qq.com/s/3xKdt-26guYHoFb3xP0muw

+

方案代码

解法:

+
1
2
3
4
5
6
7
8
class Solution:
def isUnique(self, astr: str) -> bool:
t = 0
for c in astr:
if t & (p := 1 << (ord(c) - ord('a'))):
return False
t |= p
return True
+ +

另外还有三种使用数据结构的解法

+

解法1:

+
1
2
3
class Solution:
def isUnique(self, astr: str) -> bool:
return len(astr)== len(set(astr))
+ +

解法2:

+
1
2
3
4
5
6
7
8
9
class Solution:
def isUnique(self, astr: str) -> bool:
adict={}
for value in astr:
if value in adict.keys():
return False
else:
adict[value]=0
return True
+ +

解法3:

+
1
2
3
4
5
6
7
8
9
class Solution:
def isUnique(self, astr: str) -> bool:
l=[]
for i in astr:
if i in l:
return False
else:
l.append(i)
return True
+ + +