程序员面试金典(1):确定字符互异(python)
题目描述
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
方法1
最简单的解法是将字符串中的每一个字符与剩下的字符比较,如果遇到相同的元素,则返回False
,如果直到遍历结束都没有遇到相同元素,则返回True
:这种解法的时间复杂度为O(n*n)
,空间复杂度为O(1)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by xuehz on 2017/8/20
class Different:
def checkDifferent(self, iniString):
# write code here
str_len = len(iniString)
if str_len > 256:
return True
for pos in xrange(str_len):
for index in xrange(pos + 1, str_len):
if iniString[pos] == iniString[index]:
return False
return True
方法2:
构建一个布尔的数组,索引值i对应的标记指示该字符串是否含有字母表中的第i个字符。若第二次出现,则立即返回false。若字符编码是ASCII字符集,则总共只有256个字符,若总长度超过了必定有重复。
def checkDifferent1(self, iniString):
str_len = len(iniString)
if str_len > 256:
return True
record = [False] * 256
for ch in iniString:
ch_val = ord(ch)
if record[ch_val]:
return False
record[ch_val] = True
return True
上面代码的时间复杂度为O(n)
,空间复杂度为O(1)
方法3:
我们还有一种O(nlog(n))
的算法来解决这个问题:将字符串排序,然后遍历每一个元素并与周围元素比较
def checkDifferent2(self, iniString):
str_len = len(iniString)
if str_len > 256:
return True
ll = list(iniString)
ll.sort()
#print ll
for i in xrange(1,len(ll)):
if ll[i] == ll[i-1]:
return False
return True
chr(u) 和ord(i)
中文说明:
返回整数i对应的ASCII字符。与ord()作用相反。
参数x:取值范围[0, 255]之间的正数
参考:
http://blog.csdn.net/yabg_zhi_xiang/article/details/52099301