leetCode EASY -Q125. Valid Palindrome 2
===

---
###### 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或者資料處理的時候都非常有幫助喔!希望這篇文章對你們有幫助!我們下次再見!
