所謂」變位詞「是指兩個詞之間存在組成字母的重新排列關係,如:heart 和 earth,python 和 typhon,為了簡單起見,假設參與判斷的兩個詞僅由小寫字母構成,而且長度相等
將詞1中的字元逐個到詞2中檢查是否存在存在就」打勾「標記(防止重複檢查),如果每個字元都能找到,則兩個詞是變位詞只要有1個字元找不到,就不是變位詞
def
anagramsolution1
(s1, s2)
: alist =
list
(s2)
# 複製s2到列表
pos1 =
0 stillok =
true
while pos1 <
len(s1)
and stillok:
# 迴圈s1的每個字元
pos2 =
0 found =
false
while pos2 <
len(alist)
andnot found:
if s1[pos1]
== alist[pos2]
:# 在s2逐個對比
found =
true
else
: pos2 = pos2 +
1if found:
alist[pos2]
=none
# 找到,打勾
else
: stillok =
false
# 未找到,失敗
pos1 = pos1 +
1return stillok
print
(anagramsolution1(
"abcd"
,"dcba"
))
數量級為o(n^2)
將兩個字串都按照字母順序排好序,在逐個字元對比是否相同,如果相同則是變位詞,有任何不同就不是變位詞
:# 轉為列表
alist1 =
list
(s1)
alist2 =
list
(s2)
# 分別排序
alist1.sort(
) alist2.sort(
) pos =
0 matches =
true
while pos <
len(s1)
and matches:
# 逐個對比
if alist1[pos]
== alist2[pos]
: pos = pos +
1else
: matches =
false
return matches
(anagramsolution2(
"abcd"
,"dcba"
))粗看上去,本演算法只有乙個迴圈,最多執行n次,數量級是o(n),但迴圈前面的兩個sort並不是無代價的,如果查詢下後面的章節,會發現排序演算法採用不同的解決方案,其執行時間數量級差不多是o(n^2)或者o(n log n),大過迴圈的 o(n)
所以本演算法時間主導的步驟是排序步驟
本演算法的執行時間數量級就等於排序過程的數量級o(n log n)
def
anagramsolution3
(s1, s2)
: c1 =[0
]*26 c2 =[0
]*26# 分別都計數
for i in
range
(len
(s1)):
pos =
ord(s1[i])-
ord(
'a')
c1[pos]
= c1[pos]+1
for i in
range
(len
(s2)):
pos =
ord(s2[i])-
ord(
'a')
c2[pos]
= c2[pos]+1
j =0 stillok =
true
# 計數器比較
while j <
26and stillok:
if c1[j]
== c2[j]
: j = j +
1else
: stillok =
false
return stillok
print
(anagramsolution3(
"abcd"
,"dcba"
))
計數比較演算法中有3個迴圈迭代,但不象解法1那樣存在巢狀迴圈,前兩個迴圈用於對字串進行計數,操作次數等於字串長度n
第3個迴圈用於計數器比較,操作次數總是26次
所以總操作次數t(n)=2n+36,其數量級為o(n),這是乙個線性數量級的演算法,是4個變位詞判斷演算法種效能最優的
值得注意的是,本演算法依賴於兩個長度為26的計數器列表,來儲存字元計數,這相比前3個演算法需要更多的儲存空間,如果考慮由大字符集構成的詞,還會需要更多儲存空間。
犧牲儲存空間來換取執行時間,或者相反,這種在時間空間之間的取捨和權衡,在選擇問題解法的過程中經常會出現。
資料結構與演算法 遞迴演算法(Python版)
一 整數轉換為任意進製 我們用最熟悉的十進位制分析下這個問題 十進位制有十個不同符號 convstring 0123456789 比十小的整數 轉換成十進位制,直接查表 就可以 了 convstring n 想辦法把比十大的整數,拆成一系列比十小的整 數,逐個查表,比如七百六十九,拆成 七 六 九,...
資料結構與演算法(Python)(三)
棧可以用順序表實現,也可以用鍊錶實現。棧的操作 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 python的list來實現棧的操作class stack o...
資料結構與演算法(三)
變位詞是指兩個詞之間存在組成字母的 重新排列關係 如 heart和earth,python和typhon 為了簡單起見,假設參與判斷的兩個詞僅由小寫 字母構成,而且長度相等 詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。...