python簡單算法01:字符串s1重新排列字母后是否能變s2

問題簡介
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)

1

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))

3

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章