跳至主要內容

最大回文子串

陈宣宗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;
}
上次编辑于: 2025/1/13 09:18:24
贡献者: zilizhou,黄昱皓