賞月齋原始碼共享計劃 第六期 變位詞判斷
阿新 • • 發佈:2020-10-29
本文用三種演算法實現了變位詞判斷問題。
所謂“變位詞”是指兩個詞之間存在組成字母的重新排列關係,如:heart和earth,python和typhon
假設參與判斷的詞僅由大寫字母組成。
解題目標:寫一個bool函式,以兩個詞作為引數,返回這兩個詞是否變位詞。
輸入:兩個字串s1和s2
返回:一個bool變數。
# coding=utf8 def judgeStr_1(s1, s2): # 先排序,再對比 list1 = list(s1) list2 = list(s2) list1.sort() list2.sort() # if list1 == list2: # 這樣判斷也可以 # return True # else: # return False if len(list1) != len(list2): return False for i in range(len(list1)): if list1[i] == list2[i]: continue else: return False return True def judgeStr_2(s1, s2): # 打鉤法(兩層迴圈,在s2裡邊便利找s1的當前值,找到打標記found,未找到found=false),注意s1每迴圈一次都要將found置為false l1 = list(s1) l2 = list(s2) OK = True if len(l1) != len(l2): OK = False k = 0 found = False for i in range(len(l1)): found = False for j in range(len(l2)): if l1[i] == l2[j]: found = True k = j break if found == True: l2[k] = None else: OK = False return OK def judgeStr_3(s1, s2): # 空間換時間:26個字母對應一個長為26的陣列,陣列上的數字表示對應字母在s1,s2中出現了幾次,如果出現次數一樣,則是變位次 cnt1 = [0] * 26 cnt2 = [0] * 26 l1 = list(s1) l2 = list(s2) if len(l1) != len(l2): return False # python中獲取ASCII值的函式 ,ord=ordinal(序數的,順序的) for i in range(len(l1)): cnt1[ord(l1[i])-ord('A')] += 1 for i in range(len(l2)): cnt2[ord(l2[i])-ord('A')] += 1 OK = True for i in range(len(cnt2)): if cnt1[i] == cnt2[i]: continue return False return True s1 = "ABCDEFG" s2 = "BACFEGD" result1 = judgeStr_1(s1, s2) result2 = judgeStr_2(s1, s2) result3 = judgeStr_3(s1, s2) print(result1, result2, result3)