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

参考资料