leetCode EASY -Q125. Valid Palindrome 2 === ![](https://s2.51cto.com/images/blog/202108/03/d41ce0d2323853fe7d9868daf22eac2f.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/format,webp) --- ###### tags: `leetCode`, `練習刷題`, `125` <br> ## 題目 Given a string *s*, return *true* if the *s* can be palindrome after deleting ***at most one*** character from it. ```jsx! Example 1: Input: s = "aba" Output: true Example 2: Input: s = "abca" Output: true Explanation: You could delete the character 'c'. Example 3: Input: s = "abc" Output: false ``` 這裡的需求是希望如果對象是正讀和反讀都一樣的時候,就回傳 true, 但反之是false。可是呢,這裡要把相同的文字的前一個字刪掉才進行判斷。 簡單說,要先用好一個function去刷每一個字然後做對比,如果沒有出現過,那就放入一個array裡。然後再去對比正讀和反讀是否一樣。 ## 做法: ```jsx! const validPalindrome = function(s : string){ function isPalindrome(str){ let left = 0; let right = str.length -1; while(left < right){ // 如果找找到不匹配的字符對,返回 false if(str[left] !== str[right]) return false; left ++; // 向右移動左指針 right --; //向左移動右指針 } return true; //如果所有字符都匹配,返回true } if(isPalindrome(s)) return true; let left = 0; let right = s.length -1; while(left < right) { if(s[left] !== str[right]){ //嘗試跳過左邊的字符 或 右邊的字符 return isPalindrome(s.substring(left +1 , right +1)) || isPalindrome(s.substring(left,right)); } left ++; right --; } return false; } ``` --- ```jsx! function isPalindrome(str) { let left = 0; let right = str.length - 1; while (left < right) { if (str[left] !== str[right]) { return false; // 如果找到不匹配的字符对,返回 false } left++; // 向右移动左指针 right--; // 向左移动右指针 } return true; // 如果所有字符都匹配,返回 true } ``` - 這個函數用來檢查一個 s 是否回文 - 他使用兩個指針,一個從 s 的開始(left),另一個從結束(right)。 - 這兩個指針向中間移動,比較他們只想的文字是否相等。 ### 為什麼這麼做? <br> 這是檢查回溫的經典方法。通過對稱性質,只需比較 s 的一般即可確定整個 s 是否為回文。 --- ```jsx! if (isPalindrome(s)) { return true; } ``` - 再嘗試刪除字符之前,先檢查整個 s 是否已經是回文。 ### 為什麼這麼做? <br> 這是一個快速檢查,可以立即確定沒有必要刪除任何字符的情況,提高效率。 <br> --- ```jsx! let left = 0; let right = s.length - 1; while (left < right) { if (s[left] !== s[right]) { // 尝试跳过左边的字符或右边的字符 return isPalindrome(s.substring(left + 1, right + 1)) || isPalindrome(s.substring(left, right)); } left++; right--; } ``` - 這部分代碼處理 s 中 的每個字符。 - 當遇到不匹配的 字符時,嘗試跳過跳過左邊的字符 或 右邊的字符來形成回文 ### 為什麼這樣做 <br> - **雙選擇**: - 再遇到第一個不匹配的字符對時,有兩種可能的辦法修正 - 刪除左邊的字符 或 刪除右邊的字符。 - 由於不清楚哪種選擇會成功形成回穩,因此需要檢查兩種情況。 - **使用substring方法**: - s.substring(left +1, right +1) 和 s.substring(left,right)分別創建刪除左字符和右字符的新字串。 - **短路運算**: - 使用 || 運算符,如果第一個調用 isPalindrome 返回true,則整個表達試為true,函數返回true。 - 只有當地一個調用返回false時,才會檢查第二個調用。 <br> ## 總結 刷題是為了可以更了解結構設計,不管是前端還是後端,我都建議可以嘗試刷刷卡。這對在設計component或者資料處理的時候都非常有幫助喔!希望這篇文章對你們有幫助!我們下次再見! ![image alt](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYXg4Znc1MDNtYnZydXE0aDNxNmh0dnhscjU3YzhpcmJjaHVwMjJjaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fxe8v45NNXFd4jdaNI/giphy.gif)