最大回文子串
2024年12月24日大约 2 分钟教学文档基础算法
1.最大回文子串
一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
**输入:**s = "abc"
**输出:**3
**解释:**三个回文子串: "a", "b", "c"
示例 2:
**输入:**s = "aaa"
**输出:**6
**解释:**6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
分析:
核心思想是以每个字符为中心,分别向两边扩展,检查是否为回文子串,同时考虑回文串长度为奇数和偶数的情况。
变量定义:
n:表示字符串s的长度。 letters:将字符串s转换为字符数组,以便更方便地处理。 ans:用于存储最终的回文子串数量,初始值为字符串s的长度,因为每个单个字符本身就是一个回文子串。 遍历字符串:
外层循环 for (int k = 0; k < n; k++) 遍历字符串中的每个字符,作为回文中心。 以当前字符为中心扩展:
内层循环
while (i >= 0 && j < n && letters[i--] == letters[j++])
分两种情况:
以当前字符letters[k]为中心向两边扩展,即 i = k - 1 和 j = k + 1。 以当前字符letters[k]和下一个字符letters[k+1]为中心向两边扩展,即 i = k 和 j = k + 1。 统计回文子串数量:
在扩展的过程中,如果遇到回文子串,即 letters[i] == letters[j],则将 ans 增加一次。 返回结果:
最终返回 ans,即回文子串的总数。
public int countSubstrings(String s) {
int n = s.length();
char[] letters = s.toCharArray();
int ans = n;
for (int k = 0; k < n; k++) {
// 以letters[k]为中心向两边扩
int i = k - 1, j = k + 1;
while (i >= 0 && j < n && letters[i--] == letters[j++]) {
ans++;
}
// 以letters[k]以及letters[k+1]为中心向两边扩
i = k;
j = k + 1;
while (i >= 0 && j < n && letters[i--] == letters[j++]) {
ans++;
}
}
return ans;
}
