如何确定一个字符串中是否所有字符全部互不相同

 我来答
野人无事不言L
2017-02-13 · TA获得超过1414万个赞
知道顶级答主
回答量:2242万
采纳率:0%
帮助的人:146.2亿
展开全部
在开始完成这道题之前,最好先向出题者确认的一件事情是,这是字符串是纯ASCII字符串还是Unicode字符串。这决定了你后续的解题过程,这个问题可以向面试官传达出你很关注细节,且对计算机科学有一定认识。
这里假设字符集为ASCII,当然如果是Unicode,只需要扩大内存,其他解题思路上基本是一致的。
首先需要想到的是,ASCII只有一个字节,意味着如果待检测的字符串长度超过了256位,那么这个字符串中一定有重复的元素。解题的方式有很多种,下面列举几种常见的解法:
最简单的解法是将字符串中的每一个字符与剩下的字符比较,如果遇到相同的元素,则返回 False ,如果直到遍历结束都没有遇到相同元素,则返回 True :

def is_unique_char(string):
str_len = len(string)

if str_len > 256:
return True

for pos in xrange(str_len):
for index in xrange(pos+1, str_len):
if string[pos] == string[index]:
return False

return True

这种解法的时间复杂度为 O(n*n) ,空间复杂度为 O(1) 。当然很明显,这种解法的效率非常低下,有什么更好的实现呢?
第二种解法是通过构建一个布尔值的数组,索引 index 表示ASCII码中值为 index的字符。将初值置为 False ,如果某个元素第二次出现,则表示这个字符串出现了重复的字符,函数直接返回。这种解法的Python实现如下:

def is_unique_char(string):
if len(string) > 256:
return True

record = [False] * 256

for ch in string:
ch_val = ord(ch)

if record[ch_val]:
return False

record[ch_val] = True

return True

上面代码的时间复杂度为 O(n) ,空间复杂度为 O(1) 。不过,我们可以非常确定的是,n的最大值仅仅为256。
如果使用位运算,结合Python中数字的特殊实现,我们仅需要一个数字来替代 record 即可实现上面的算法:

def is_unique_char(string):
if len(string) > 256:
return True

record = 0L

for ch in string:
print record
ch_val = ord(ch)

if (record & (1 << ch_val)) > 0:
return False

record |= (1 << ch_val)

return True

如果允许对字符串进行修改,则我们还有一种 O(nlog(n)) 的算法来解决这个问题:将字符串排序,然后遍历每一个元素并与周围元素比较(请自行尝试)。
如果考虑到Python的某些数据结构,则我们可以通过 collections 里的工具来实现:

from collections import Counter

is_unique_char = lambda s: True if len(s) > 256 else not bool(filter(lambda n: n > 1, Counter(s).values()))
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式