問題簡介
1. 使用list函數
2. 使用Collection(count函數)
3. 使用散列表
問題簡介:
給定兩個字符串s1、s2,判斷其中一個字符串重新排列字母后能否變成另外一個?如:
輸入:s1=“abc”,s2=“bca”
輸出:true
輸入:s1=“abc”,s2=“bad”
輸出:false
1.使用sort函數
sort函數定義:sort(cmp=None, key=None, reverse=False)
其中:
cmp:用於比較的函數(大於時返回1,小於時返回-1,等於時返回0),比較什麼由key決定,有默認值,迭代集合中的一項;
key:用列表元素的某個屬性和函數進行作爲關鍵字,有默認值,迭代集合中的一項;
reverse:排序規則. reverse = True 或者 reverse = False,有默認值。
思路:首先將字符串轉爲數組,然後使用sort函數進行排序,再做一些判斷即可
def compare(a,b):
if len(a)==len(b):
lista=list(a)
listb=list(b)
lista.sort()
listb.sort()
print(lista==listb)
else:
print(False)
compare(s1,s2)
compare(s3,s4)
2.使用Collection(count函數)
collections 模塊----Python標準庫,是數據結構常用模塊
常用類型有:
計數器(Counter)(將元素數量統計,然後計數返回一個字典,鍵爲元素,值爲元素個數)
雙向隊列(deque)(deque是棧和隊列的一種廣義實現,deque是"double-end queue"的簡稱;deque支持線程安全、有效內存地以近似O(1)的性能在deque的兩端插入和刪除元素,儘管list也支持相似的操作,但是它主要在固定長度操作上的優化,從而在pop(0)和insert(0,v)(會改變數據的位置和大小)上有O(n)的時間複雜度
默認字典(defaultdict)
有序字典(OrderedDict)
可命名元組(namedtuple)(命名的元組,意味給元組中的每個位置賦予含義,意味着代碼可讀性更強,namedtuple可以在任何常規元素使用的地方使用,而且它可以通過名稱來獲取字段信息而不僅僅是通過位置索引)
from collections import Counter as cco#導入collections.Counter
def compare(a,b):
return cco(a)==cco(b)
compare(s1,s2),compare(s3,s4)
3.使用散列表
思路:通過建立散列表統計每一個字符出現的次數,時間複雜度爲n,這種解法一般會在面試中問到
#首先判斷兩個字符串長度是否相同
def compare(a,b):
if len(a)!=len(b):
return False
#轉爲列表
a=list(a)
b=list(b)
a_str=[0]*256
b_str=[0]*256
#通過256散列表確定每個字符中的次數
for i in range(len(s1)):
a_str[ord(a[i])]+=1
b_str[ord(b[i])]+=1
#通過散列表比較每一個字符出現的次數
for i in range(len(a_str)):
if a_str[i]!=b_str[i]:
return False
return True
print(compare(s1,s2))
print(compare(s3,s4))