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