變位詞是指兩個詞之間存在組成字母的
重新排列關係
如:heart和earth,python和typhon
為了簡單起見,假設參與判斷的兩個詞僅由小寫
字母構成,而且長度相等
詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。(打勾標記——將對應字元設定為non
#自己編寫的程式:
#逐字檢查程式一:
defanagramsolution
(s1,s2)
: l1 =
len(s1)
l2 =
len(s2)
s1 =
list
(s1)
#字串轉換為列表,列表可操作性強
s2 =
list
(s2)
pose1 =
0if l1!=l2:
return
"false"
#長度不同直接錯
else
:while pose1 < l1:
pose2 =
0 flag =
0while pose2 < l2:
if s1[pose1]
==s2[pose2]
: s2[pose2]
=none
flag =
1else
: pose2 = pose2 +
1if flag ==1:
pose1 = pose1 +
1else
:return
"false"
pose1 = pose1 +
1return
"yes"
print
(anagramsolution(
"asdfg"
,"gsdfa"
))
#高淇老師課示程式:
#高淇老師課示程式:
defanagramsolution
(s1,s2)
: alist =
list
(s2)
stillok =
true
pose1 =
0while pose1 <
len(s1)
and stillok:
pose2 =
0 found =
true
while pose2 <
len(alist)
andnot found:
if s1[pose1]
== alist[pose2]
: found =
true
else
: pose2 = pose2 +
1if found:
alist[pose2]
=none
else
: stillok =
false
pose1 = pose +
1return stillok
print
(anagramsolution(
"asdfg"
,"gsdfa"
))
解析:
上述兩程式主要部分皆為雙重迴圈:
故數量級為o(n^2)
轉換成列表之後排序,再愛歌詞進行比較*****
自己編寫的程式:
#排序檢查變位詞:
defsl
(s1,s2)
: s1 =
sorted
(list
(s1)
) s2 =
sorted
(list
(s2)
)if s1 == s2:
return
"yes"
else
:return
"no"
#高淇老師課示程式:
def
sl(s1,s2)
: 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
解析:
上述演算法看上去主要部分是迴圈部分,實則不然。排序sort及sorted的數量級是o(nlogn),因此主要部分是排序演算法。因此,數量級為o(nlogn)。
思路:❖解題思路:對比兩個詞中每個字母出現的次數,如果26個字母出現的次數都相同的話,這兩個字串就一定是變位詞
❖具體做法:為每個詞設定乙個26位的計數
器,先檢查每個詞,在計數器中設定好每
個字母出現的次數
❖計數完成後,進入比較階段,看兩個字元
串的計數器是否相同,如果相同則輸出是
變位詞的結論
#雜湊表檢查變位詞:
defsll
(s1,s2)
: c1=[0
]*26 c2=[0
]*26for i in s1:
c1[ord(i)
-ord
('a')]
+=1for i in s2:
c2[ord(i)
-ord
('a')]
+=1if c1==c2:
return
true
else
:return
false
print
(sll(
"asdfg"
,"gsdfa"))
print
(sll(
"asdfgh"
,"asdfghjk"))
print
(sll(
"aaadds"
,"sddaaa"
))
解析:
上述演算法數量級為o(n)。但儲存空間需求更大,兩個26的計數列表
##學自陳斌老師
資料結構與演算法(三)
鍊錶由單向的鏈變成雙向鏈,使用這種資料結構,我們不再拘束於單鏈表的單向建立於遍歷等操作。在單鏈表中,有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域負責鍊錶之間的 聯絡 在雙向鍊錶中,需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。單鏈表的結構 struct list 雙向鍊錶的...
演算法與資料結構筆記三
摘錄from 大話資料結構 1.樹 樹的度 結點擁有的子樹數成為結點的度 degree 度為0的結點成為葉節點 leaf 或終端結點。樹的深度或高度 結點的層次level,從根節點開始,根為第一層,根的孩子為第二層。樹中最大層次稱為樹的深度 depth 或高度,當前樹的深度為4.樹的儲存 樹儲存當然...
資料結構與演算法 排序 三
假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或者1的有序子串行 再兩兩歸併,如此重複,直至得到乙個長度為n的有序序列為止。歸併排序是一種比較占用記憶體,但是卻效率高並穩定的演算法,時間複雜度是o logn 對簡單選擇排序的一種改...