題目
寫乙個bool函式,以兩個詞作為引數,返回這兩個詞是否變位詞。(」變位詞「是指兩個詞之間存在組成字母的重新排列關係,如heart和earth,python和typhon)(假設輸入的單詞都是小寫並且長度相同)
解答解法1:逐字檢查法(時間複雜度o(n^2))
將詞1中的字元逐個到詞2中檢查是否存在,存在就「打勾」標記(防止重複檢查)。如果每個字元都能找到,則兩個詞是變位詞,只要有乙個字元找不到,就不是變位詞
# 解法1:逐字檢查法
defanagramsolution1
(s1, s2)
: alist2 =
list
(s2)
pos1 =
0 stillok =
true
while pos1 <
len(s1)
and stillok:
pos2 =
0 found =
false
while pos2 <
len(alist2)
andnot found:
if s1[pos1]
== alist2[pos2]
: alist2[pos2]
=none
found =
true
else
: pos2 +=1if
not found:
stillok =
false
pos1 +=
1return stillok
解法2:排序比較法(時間複雜度o(nlogn))
將兩個字串排好序,再逐個比較對應位置上的字元是否一致,如果相同就是變位詞,如果有任何不同就不是變位詞。
def
anagramsolution2
(s1, s2)
: alist1 =
list
(s1)
alist2 =
list
(s2)
alist1.sort(
) alist2.sort(
) pos =
0 is_match =
true
while pos <
len(s1)
and is_match:
if alist1[pos]
== alist2[pos]
: pos +=
1else
: is_match =
false
return is_match
解法3:計數比較法(時間複雜度o(n))
對比兩個詞中每個字母出現的次數,如果26個字母,每個字母出現的次數相同的話,則這兩個字串一定是變位詞。
def
anagramsolution3
(s1, s2)
: c1 =[0
]*26 c2 =[0
]*26for i in
range
(len
(s1)):
n =ord(s1[i])-
ord(
'a')
c1[n]+=1
for i in
range
(len
(s2)):
n =ord(s2[i])-
ord(
'a')
c2[n]+=1
j =0 stillok =
true
while j <
26and stillok:
if c1[j]
== c2[j]
: j +=
1else
: stillok =
false
return stillok
資料結構與演算法 遞迴演算法(Python版)
一 整數轉換為任意進製 我們用最熟悉的十進位制分析下這個問題 十進位制有十個不同符號 convstring 0123456789 比十小的整數 轉換成十進位制,直接查表 就可以 了 convstring n 想辦法把比十大的整數,拆成一系列比十小的整 數,逐個查表,比如七百六十九,拆成 七 六 九,...
MOOC資料結構與演算法Python版 第六周測驗
1 單選 2分 下列哪個演算法使用到了分治策略?d 2單選 2分 函式值快取最適合使用哪種python中的資料型別?b 3 單選 2分 已知數列g x 滿足 根據遞推式寫出求數列值的遞迴演算法,問原始演算法與採用函式值快取的演算法時間複雜度分別為多少?a 4 單選 2分 博物館大盜問題中,若共有10...
資料結構與演算法Python版學習筆記一
用input獲取輸入時,不能加提示符 多行輸入,每一行對應乙個input函式,根據題目要求的資料型別進行轉換 如果每行乙個整數,則可以寫入以下 a int input 單行輸入多個變數 以字串形式儲存 輸入兩個變數 a,b input split 輸入三個變數 a,b,c input split 輸...