所謂回文字串,就是正讀和反讀都一樣的字串,比如「level」或者「noon」等等就是回文串。即是對稱結構
判斷回文字串
方法一:
def
is_palindrome
(s):
return
true
if s == s[::
-1]else
false
方法二:
def
is_palindrome
(s):
length =
len(s)
ifnot length:
# 空字串
return
true
mid_index = length //
2# 如果s長度為奇數則是中點,偶數則是後面那個中點
index =
0 status =
true
while index < mid_index:
if s[index]
== s[length -
1- index]
: index +=
1else
: status =
false
break
return status
判斷回文鍊錶
思路
注意事項:
快慢指標定位中點時要區分奇偶情況,奇數情況,中點位置不需要矯正,偶數情況,使用偶數定位中點策略,要確定是返回上中位數或下中位數
如果是返回上中位數,後半部分串頭取next,如果是返回下中位數,後半部分串頭既是當前節點位置,但前半部分串尾要刪除掉當前節點
**
'''
'''class
solution
(object):
defis_palindrome
(self, head: listnode)
->
bool
:if head is
none
:# 空
return
false
if head.
next
isnone
:# 1個節點
return
true
slow = fast = head
# 1. 定中點
while fast and fast.
next
: slow = slow.
next
fast = fast.
next
.next
# 快慢指標定位中點,此時fast已到達鏈尾,如果長度為奇數,則slow到達中心點,長度為偶數,則slow到達下中位點
# 2. 後半段倒置
pre =
none
# 倒置後的最後乙個節點必為none,以此確定第三步遍歷時的終點
cur = slow # 當前要倒置的第乙個節點
nxt = slow.
next
# 當前要倒置的節點的下乙個節點
while nxt:
# 只要沒有到達原鍊錶的終點就一直進行倒置
cur.
next
= pre # 將當前節點的下乙個節點指向"前"乙個節點,進行倒置
# 相鄰節點倒置完成後,向後整體偏移1個單位
pre = cur
cur = nxt
nxt = cur.
next
# 當前cur是最後乙個節點,需要和它前面的節點進行最後一次倒置,來完成整個後半段倒置
cur.
next
= pre
# 3. cur就是倒置完成後的後半段的頭節點,同時遍歷cur和head,如果遍歷完cur未出現不同的節點,則為回文鍊錶
while cur.
next
:if cur.val != head.val:
return
false
cur = cur.
next
head = head.
next
# 此時cur為後半段的最後乙個節點,還需要判斷此時的cur和head的值是否相同
return cur.val == head.val
測試
# head =none
head = listnode(1)
head.
next
= listnode(2)
head.
next
.next
= listnode(1)
print
(solution(
).is_palindrome(head)
)
判斷回文數
思路
映入腦海的第乙個想法是將數字轉換為字串,並檢查字串是否為回文。但是,這需要額外的非常量空間來建立問題描述中所不允許的字串。
第二個想法是將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是回文。 但是,如果反轉後的數字大於 int.max,我們將遇到整數溢位問題。
按照第二個想法,為了避免數字反轉可能導致的溢位問題,為什麼不考慮只反轉int 數字的一半?畢竟,如果該數字是回文,其後半部分反轉後應該與原始數字的前半部分相同。
例如,輸入 1221,我們可以將數字「1221」的後半部分從「21」反轉為「12」,並將其與前半部分「12」進行比較,因為二者相同,我們得知數字 1221 是回文。
讓我們看看如何將這個想法轉化為乙個演算法。
演算法
首先,我們應該處理一些臨界情況。所有負數都不可能是回文,例如:-123 不是回文,因為 - 不等於 3。所以我們可以對所有負數返回 false。
現在,讓我們來考慮如何反轉後半部分的數字。 對於數字 1221,如果執行 1221 % 10,我們將得到最後一位數字 1,要得到倒數第二位數字,我們可以先通過除以 10 把最後一位數字從 1221 中移除,1221 / 10 = 122,再求出上一步結果除以10的餘數,122 % 10 = 2,就可以得到倒數第二位數字。如果我們把最後一位數字乘以10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉後的數字。 如果繼續這個過程,我們將得到更多位數的反轉數字。
現在的問題是,我們如何知道反轉數字的位數已經達到原始數字位數的一半?
我們將原始數字除以 10,然後給反轉後的數字乘上 10,所以,當原始數字小於反轉後的數字時,就意味著我們已經處理了一半位數的數字。
**
class
solution
(object):
defis_palindrome
(self, num:
int)
->
bool
:# 當 x < 0 時,x 不是回文數
# 如果數字的最後一位是 0,為了使該數字為回文,則其第一位數字也應該是 0
# 只有 0 滿足這一屬性
if num <0or
(num %
10==
0and num !=0)
:return
false
reverted_num =
0while num > reverted_num:
reverted_num = reverted_num *
10+ num %
10 num /=
10# 當數字長度為奇數時,我們可以通過 revertednumber / 10 去除處於中位的數字。
# 例如,當輸入為12321時,在 while 迴圈的末尾我們可以得到 x = 12,revertednumber = 123,
# 由於處於中位的數字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除。
return num == reverted_num or num == reverted_num /
10# 測試
print
(solution(
).is_palindrome(0)
)print
(solution(
).is_palindrome(10)
)print
(solution(
).is_palindrome(
101)
)
回文字串判斷 遞迴實現
所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的。比如 level aaabbaaa 題目 判斷乙個字串是否為回文 解法 遞迴 遞迴的作用在於把問題的規模不斷縮少,直到問題縮少到能簡單地解決 問 如何縮少問題規模?答 通過觀察可以知道,乙個回文字串其中內部也是回文。所以,我們只需要以去...
python回文字串程式設計 P086 回文字串
所屬年份 2012.3 請編寫函式fun,該函式的功能是 判斷字串是否為回文,若是,則函式返回1,主函式中輸出 yes 否則返回0,主函式中輸出 no 回文是指順讀和倒讀都一樣的字串。例如,字串level是回文,而字串123312就不是回文。include define n 80 int fun c...
python 實戰38 回文字串
題目內容 給定乙個字串,判斷它是否是回文字串 即類似於peep,12321這樣的對稱字串 如果是輸出true,不是則輸出false。判斷過程中假定只考慮字母和數字字元,而且忽略字母的大小寫和其它符號 如空格 標點符號等 輸入格式 共一行,為乙個字串。輸出格式 共一行,為true或false。輸入樣例...