程序員面試金典(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