題目說明:給你一組字串,要你判斷移除掉非字元的字串(如''"":等)以及將這組字串改成小寫後是否為回文
Case 1
Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama"(移除掉,:以及空格後) is a palindrome.
Case 2
Input: s = "race a car"
Output: false
Explanation: "raceacar"(移除掉空格) is not a palindrome.
Case 3
Input: s = " "
Output: true
Explanation: s is an empty string "" after removing non-alphanumeric characters.
Since an empty string reads the same forward and backward, it is a palindrome.
什麼是回文(palindrome)?
就是一組字不管是從前面還是後面唸都是一樣的;例如:aacaa就是一組回文,abba也是一組回文,aabb就不是回文。其實就是將字串頭尾互換後是否相同
解題思路:可以運用雙指標(two pointer)的概念進行解題,一個指標從字串的頭開始,一個從字串的尾開始進行兩兩比對。每次比對完後頭的指標往右一步,尾端的指標往左一步,如果只要其中有一次的比對是不相同的,該字串就不是回文,回傳false
附上程式碼和註解
Java
class Solution {
public boolean isPalindrome(String s) {
s=s.replaceAll("[^A-Za-z0-9]", "");//用正規表示法移除掉非英文字母的字
s=s.replaceAll(" ","");//移除掉空格
s=s.toLowerCase();//全部變小寫字母
if(s.length()==0){
return true;
}
int head=0;
int tail=s.length()-1;
while(head<tail){//頭的指標不能超過尾端
if(s.charAt(head)!=s.charAt(tail)){
return false;//只要一次比對不符就非回文
}
head++;//每次比對完頭的指標向右
tail--;//每次比對完尾端的指標向左
}
return true;//都正確回傳true
}
}
Python
class Solution:
def isPalindrome(self, s: str) -> bool:
s = ''.join(filter(str.isalnum, s))
return s.lower()==s.lower()[::-1]
*Python這邊使用比較偷吃步的方式,將字串移除掉非英文字母的字後直接反轉字串進行比較,雖然一樣可以通過,但是就沒有用到指標的概念,因此較不建議