「回文」是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如「我為人人,人人為我」等。在數學中也有這樣一類數字有這樣的特徵,成為回文數(palindrome number)。 [1]那麼 在計算程式設計中我們如何寫一段程式來判斷乙個字串是否符合回文的特徵呢?設n是一任意自然數。若將n的各位數字反向排列所得自然數n1與n相等,則稱n為一回文數。例如,若n=1234321,則稱n為一回文數;但若n=1234567,則n不是回文數。 [1]
注意:1.偶數個的數字也有回文數124421
2.小數沒有回文數
請看示例,題目來自於leetcode125.
**如下:
class
solution
:def
ispalindrome
(self, s:
str)
->
bool
:# 定義new_s儲存 對s進行處理過後的新s
new_s =
''# s首先去掉所有空格並都轉化為小寫
for i in s.replace(
' ','')
.lower():
# 若 i 屬於[a,z] or [0,9],則併入新字串,此舉主要是為了去掉標點
if(i >=
'a'and i <=
'z')
or(i >=
'0'and i <=
'9')
: new_s += i
# 定義雙指標l,r 分別指向new_s頭尾
l, r =0,
len(new_s)-1
while l < r:
# 回文數特徵是首位各位依次相等,若不滿足此條件,直接返回false
if new_s[l]
!= new_s[r]
:return
false
# 首尾指標分別向後/向前移動
l +=
1 r -=
1# 若首尾指標相遇時依然沒有提前返回false,則此串一定為回文串,返回true即可
return
true
可以看出,判斷回文串的關鍵在於利用指向頭尾的雙指標來分別對首尾各位依次判斷。
接下來我們看下稍稍高階的一題,題目來自leetcode680
由於上面的經驗,我們很容易能寫出雙指標的**,但請注意,此題發生了一點小的變化,它允許最多刪除乙個字元,顧名思義,即它給了這個字串一次機會,如果它本來就是回文串,那麼ok皆大歡喜,我們之前的方法拿來即用,若它不是,我們可以有一次機會選擇刪掉某乙個字元,再來判斷這個新的字串是否為回文串。
很容易想到暴力的方法,即對每一位字元做一次while l < r 操作,只要其中有一次是回文,那麼我們就返回true,否則返回false。但是題目中給出了串長,50000.so 此路不通。
我們回到之前的討論,可以看出,此題關鍵在於我們應該如何選擇刪掉字元繼續匹配,為了尋找如何刪除的思路,我們先寫出乙個刪掉乙個字元後可以變成回文串的例子,觀察其規律。例如:
容易看出,這個字串我們刪除字元 『b』 或者字元 『c』 都能使其變為回文串,根據雙指標移動的規律,我們不難看出,『b』 與 『c』 正是此時 l 與 r 指標所指向的字元。於是我們可以這樣嘗試,首先正常匹配,當出現一次失效匹配時,我們嘗試刪除左指標指向的字元,即新串為區間為 [l+1, r] ,同理我們刪去右指標指向的字元,即新串區間為 [l, r-1],我們對這兩個串在進行一次匹配,由於它的機會已耗盡,所以若這兩個串都不是回文,那麼我們就可以斷定原字串無法在至多修改一次的條件下變為回文字串。
**如下:
class
solution
:def
validpalindrome
(self, s:
str)
->
bool
:def
checkpalindrome
(low, high)
: l, r = low, high
while l < r:
if s[l]
!= s[r]
:return
false
l +=
1 r -=
1return
true
l, r =0,
len(s)-1
# 若s[l] == s[r],則繼續迴圈,否則對l+1 與 l-1呼叫checkpalindrome,
# 即可判斷 最多刪除乙個字元的情況下 是否為回文字串
while l < r:
if s[l]
== s[r]
: l +=
1 r -=
1else
:return checkpalindrome(l +
1, r)
or checkpalindrome(l, r -1)
return
true
en python判斷是否回文數
設n是一任意自然數。若將n的各位數字反向排列所得自然數n1與n相等,則稱n為一回文數。例如,若n 1234321,則稱n為一回文數 但若n 1234567,則n不是回文數。上面的解釋就是說回文數和逆序後的結果是相等的。這就是判斷乙個數值是否是回文數的標準。也是根據這個思路來實現的。coding ut...
判斷回文數
如果乙個數的反向倒置數和它的順向數一樣,那麼這個數稱為回文數。編寫乙個測試程式,提示使用者輸入乙個整數值,然後報告這個數是不是回文數。我先後一共寫了三個函式。方法一 由於題目要求輸入的是整數值,所以按照整數的方法倒置數字,與原數比較即可。public class palindrom public s...
判斷回文數
回文 是指正讀反讀都能讀通的句子,它是古今中外都有的一種修辭方式和文字遊戲,如 我為人人,人人為我 等。在數學中也有這樣一類數字有這樣的特徵,成為回文數 palindrome number 設n是一任意自然數。若將n的各位數字反向排列所得自然數n1與n相等,則稱n為一回文數。例如,若n 123432...