資料結構與演算法(Python版) 課堂例項 變位詞

2021-10-24 05:39:22 字數 2026 閱讀 4880

題目

寫乙個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 輸...