Palindrome 回文字串
Palindrome 回文字串
Categories:
Palindrome 回文字串
- a
- aa
- aba
- abba
- abcba
程式碼
檢查是否為 Palindrome 字串
Golang
// 是否移除一字元變成反轉母音字
func validPalindrome(checkText string) bool {
// 將檢查的文字轉換成 byte (uint8)
checkTextByte := []byte(checkText)
// 設定檢查索引
frontLetterIndex := 0
backLetterIndex := len(checkTextByte) - 1
for frontLetterIndex < backLetterIndex {
// 檢查字母是否相同
if checkTextByte[frontLetterIndex] != checkTextByte[backLetterIndex] {
// 若字母不相同,去除前後個一個字,檢查是否為 Palindrome 文字
return isPalindromeText(checkTextByte, frontLetterIndex, backLetterIndex-1) || isPalindromeText(checkTextByte, frontLetterIndex+1, backLetterIndex)
}
// 字母相同,移動前後字母索引
frontLetterIndex++
backLetterIndex--
}
// 字母都相同,為 Palindrome 文字
return true
}
// 檢查是否為 Palindrome 文字
func isPalindromeText(checkTextByte []byte, frontLetterIndex int, backLetterIndex int) bool {
for frontLetterIndex < backLetterIndex {
if checkTextByte[frontLetterIndex] != checkTextByte[backLetterIndex] {
// 若字母不相同,則不是 Palindrome 文字
return false
}
// 字母相同,移動前後字母索引
frontLetterIndex++
backLetterIndex--
}
// 字母都相同,為 Palindrome 文字
return true
}
JavaScript
function validPalindrome(checkText) {
// 設定檢查指標
var leftPointer = 0;
var rightPointer = checkText.length - 1;
while (leftPointer <= rightPointer) {
// 取得指標字母
var leftLetter = checkText[leftPointer];
var rightLetter = checkText[rightPointer];
if (leftLetter != rightLetter) {
// 假如左右子母不相同,移除前後一個字,檢查是否為 Palindrome 字串
return (isPalindromeText(checkText, leftPointer, rightPointer - 1)
|| isPalindromeText(checkText, leftPointer + 1, rightPointer));
}
// 移動下一個檢查指標
leftPointer++;
rightPointer--;
}
return true;
}
// 檢查是否為 Palindrome 字串
function isPalindromeText(checkText, leftPointer, rightPointer) {
while (leftPointer < rightPointer) {
// 取得指標字母
var leftLetter = checkText[leftPointer];
var rightLetter = checkText[rightPointer];
if (leftLetter != rightLetter) {
// 字母檢查不同,不是 Palindrome 字串
return false;
}
// 移動下一個檢查指標
leftPointer++;
rightPointer--;
}
// 字母都相同,為 Palindrome 字串
return true;
}
TypeScript
function validPalindrome(checkText: string): boolean {
// 設定檢查指標
let leftPointer = 0;
let rightPointer = checkText.length - 1;
while (leftPointer <= rightPointer) {
// 取得指標字母
let leftLetter = checkText[leftPointer];
let rightLetter = checkText[rightPointer];
if (leftLetter != rightLetter) {
// 假如左右子母不相同,移除前後一個字,檢查是否為 Palindrome 字串
return (isPalindromeText(checkText, leftPointer, rightPointer -1)
|| isPalindromeText(checkText, leftPointer + 1, rightPointer));
}
// 移動下一個檢查指標
leftPointer++;
rightPointer--;
}
return true;
};
// 檢查是否為 Palindrome 字串
function isPalindromeText(checkText: string, leftPointer: number, rightPointer: number) {
while (leftPointer < rightPointer) {
// 取得指標字母
let leftLetter = checkText[leftPointer];
let rightLetter = checkText[rightPointer];
if (leftLetter != rightLetter) {
// 字母檢查不同,不是 Palindrome 字串
return false;
}
// 移動下一個檢查指標
leftPointer++;
rightPointer--;
}
// 字母都相同,為 Palindrome 字串
return true;
}
檢查是否為 Palindrome 整數
TypeScript
function isPalindrome(checkNumber: number): boolean {
if (checkNumber < 0) {
// 負數都會有「- 負數符號」,所以都沒辦法變成 Palindrome 整數
return false;
}
// 取得計算左側數字 divider 分母
let divider = 1;
while (checkNumber >= divider * 10) {
// 假如分母 * 10 還是小於原本數字,表示分母還可以繼續加
divider *= 10;
}
while (checkNumber) {
// 右側數字
let rightDigit = checkNumber % 10;
// 左側數字
let leftDigit = Math.floor(checkNumber / divider);
if (leftDigit != rightDigit) {
// 假如數字不相同,表示這個不是 Palindrome 整數
return false;
}
// 取得下一個要檢查的整數,去除原數字的左右數字
// 取餘數:去除最左邊數字
checkNumber = checkNumber % divider;
// 除以 10:去除最右邊數字
checkNumber = Math.floor(checkNumber / 10);
// 取得去除左右數字後,下一個檢查的分母
divider = divider / 100;
}
return true;
};
LeetCode 題目
題目 | 說明 |
---|---|
5. Longest Palindromic Substring | 傳入字串,取得最長的 Palindrome 字串 |
9. Palindrome Number | 傳入正負整數,判斷是否為 Palindrome 整數 |
409. Longest Palindrome | 傳入字串,取得最長的 Palindrome 字串長度 |
647. Palindromic Substrings | 取得所有 Palindromic 子字串數量 |
680. Valid Palindrome II | 是否 最多移除一字元 變成反轉母音字 |