# -*- coding:utf-8 -*-
'''
请实现一个算法,确定一个字符串的所有字符是否全都不同。
这里我们要求不允许使用额外的存储结构。
给定一个string iniString,
请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。
保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
解法1:将字符串中的每个字符与其余字符进行比较,时间复杂度为O(n**2),空间复杂度为O(1)
解法2:由于题目中有提到,字符串中的字符都是ASCII码,则它转换成int数值后是0-255之间
构建哈希表解决即可
解法3:对输入的字符串进行排序,再检查是否有相邻的两个元素相等的情况
'''
class Different:
def checkDifferent_1(self, iniString):
# write code here
if len(iniString)<=1:
return True
else:
for i in range(len(iniString)):
for j in range(i+1,len(iniString)):
if iniString[i]==iniString[j]:
return False
return True
def checkDifferent_2(self, iniString):
if len(iniString)<=1:
return True
else:
hash_table=[0 for i in range(256)]
for c in iniString:
# python中将字符转换成ASCII码值的函数 ord(char)
# python中将ASCII码值转换成字符的函数 chr(int)
if hash_table[ord(c)]==1:
return False
else:
hash_table[ord(c)]=1
return True
def quick_sort(self,input_str):
if len(input_str)<=1:
return input_str
# 返回对输入字符串进行快速排序的结果
povit_value=input_str[0]
start=0
end=len(input_str)-1
# start和end指针交替有效,保证每次进入while循环的时候,start无效,end有效
while(1):
while(end>start):
if input_str[end]>=povit_value:
end-=1
else:
break
if end==start:
break
else:
# print('here',input_str[start],input_str[end],type(input_str[end]))
input_str[start]=input_str[end]
start+=1
while(start<end):
if input_str[start]<=povit_value:
start+=1
else:
break
if start==end:
break
else:
input_str[end]=input_str[start]
return self.quick_sort(input_str[:end])+[povit_value]+self.quick_sort(input_str[(end+1):])
def checkDifferent(self, iniString):
# 字符之间可以直接比较大小,字符之间比较大小的方式就是它们的ASCII码谁大谁小
# 使用快速排序算法对输入的字符串进行排序
iniInt=list(map(lambda x:ord(x),iniString))
sorted_str=self.quick_sort(iniInt)
for i in range(1,len(sorted_str)):
if sorted_str[i]==sorted_str[i-1]:
return False
return True
if __name__=="__main__":
print(Different().checkDifferent("aeiou"
))
print(Different().checkDifferent("BarackObama"
))