iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0

題目說明:給你一組字串,要你判斷移除掉非字元的字串(如''"":等)以及將這組字串改成小寫後是否為回文

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這邊使用比較偷吃步的方式,將字串移除掉非英文字母的字後直接反轉字串進行比較,雖然一樣可以通過,但是就沒有用到指標的概念,因此較不建議


上一篇
Day 11 Linked List Cycle
下一篇
Day 13 Sort Colors
系列文
從leetcode學習資料結構和演算法31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言