Palindrome 回文字串

Palindrome 回文字串

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 是否 最多移除一字元 變成反轉母音字

參考資料