647. Palindromic Substrings
Leetcode 问题: 647. Palindromic Substrings
Categories:
题目
Given a string s, return the number of palindromic substrings in it.
A string is a palindrome when it reads the same backward as forward.
A substring is a contiguous sequence of characters within the string.
传入一个 字串 s
,计算所有这个字串的所有 palindromic 子字串
数量
Example
Input: s = "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".
Input: s = "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".
演算法
1. 检查起点为奇数
及偶数
个数的 Palindromic 子字串
如果起点是 Palindromic 字串
,那选择一起点后,左右指标往左右移动后的字母也相同
,那也一定是 Palindromic 字串
当左右指标检查的字母不同,则就不是 Palindromic 字串
奇数 Palindromic 字串
e.g. aba
字母 | a | b | a |
---|---|---|---|
左指标 | ↑ | ||
右指标 | ↑ |
左右指标左右移动,检查字母相同,所以也是 Palindromic 字串
字母 | a | b | a |
---|---|---|---|
左指标 | ↑ | ||
右指标 | ↑ |
偶数 Palindromic 字串
e.g. abba
字母 | a | b | b | a |
---|---|---|---|---|
左指标 | ↑ | |||
右指标 | ↑ |
左右指标左右移动,检查字母相同,所以也是 Palindromic 字串
字母 | a | b | b | a |
---|---|---|---|---|
左指标 | ↑ | |||
右指标 | ↑ |
答案
JavaScript
function countSubstrings(checkText) {
// Palindromic 子字串数量
var totalPalindromicSubstringCount = 0;
// 设定检查指标
var leftPointer = 0;
var rightPointer = 0;
// 检查 Palindromic 子字串数量
for (var i = 0; i < checkText.length; i++) {
// 检查「奇数」长度的 Palindromic 子字串
// 左右起点相同
leftPointer = i;
rightPointer = i;
while (leftPointer >= 0 && rightPointer < checkText.length && checkText[leftPointer] == checkText[rightPointer]) {
// 当左右指标都在字串长度中,没有超出字串范围,比较左右字相同的话,则找到 Palindromic 子字串
// Palindromic 子字串数量 + 1
totalPalindromicSubstringCount++;
// 移动左右指标,继续检查下两个字母
leftPointer--;
rightPointer++;
}
// 检查「偶数」长度的 Palindromic 子字串
// 左右起点差一格
leftPointer = i;
rightPointer = i + 1;
while (leftPointer >= 0 && rightPointer < checkText.length && checkText[leftPointer] == checkText[rightPointer]) {
// 当左右指标都在字串长度中,没有超出字串范围,比较左右字相同的话,则找到 Palindromic 子字串
// Palindromic 子字串数量 + 1
totalPalindromicSubstringCount++;
// 移动左右指标,继续检查下两个字母
leftPointer--;
rightPointer++;
}
}
return totalPalindromicSubstringCount;
}
TypeScript
function countSubstrings(checkText: string): number {
// Palindromic 子字串数量
let totalPalindromicSubstringCount = 0;
// 设定检查指标
let leftPointer = 0;
let rightPointer = 0;
// 检查 Palindromic 子字串数量
for (let i = 0; i < checkText.length; i++) {
// 检查「奇数」长度的 Palindromic 子字串
// 左右起点相同
leftPointer = i;
rightPointer = i;
while (leftPointer >= 0 && rightPointer < checkText.length && checkText[leftPointer] == checkText[rightPointer]) {
// 当左右指标都在字串长度中,没有超出字串范围,比较左右字相同的话,则找到 Palindromic 子字串
// Palindromic 子字串数量 + 1
totalPalindromicSubstringCount++;
// 移动左右指标,继续检查下两个字母
leftPointer--;
rightPointer++;
}
// 检查「偶数」长度的 Palindromic 子字串
// 左右起点差一格
leftPointer = i;
rightPointer = i + 1;
while (leftPointer >= 0 && rightPointer < checkText.length && checkText[leftPointer] == checkText[rightPointer]) {
// 当左右指标都在字串长度中,没有超出字串范围,比较左右字相同的话,则找到 Palindromic 子字串
// Palindromic 子字串数量 + 1
totalPalindromicSubstringCount++;
// 移动左右指标,继续检查下两个字母
leftPointer--;
rightPointer++;
}
}
return totalPalindromicSubstringCount;
};