文章

74

粉丝

0

获赞

94

访问

8.2k

头像
找出字符串的最长回文子串(回文子串模板题) 题解:
P5278
发布于2025年8月21日 21:45
阅读数 49

中心扩展法: 


回文串的长度都是奇数,我们称其为奇回文串, 例如 bcb。

回文串的长度都是偶数,我们称其为偶回文串, 例如 bccb。

比如子串 abccba,我们可以从头遍历每个字母,若是奇回文串,则将其视作中心点,若是偶回文串,则将其与其后面一位视为中心,向外扩散并判断是否对称:

cc 是回文串。
看看 cc 左右两边的字母是不是一样的,一样,那么 bccb 是回文串。
继续,看看 bccb 左右两边的字母是不是一样的,一样,那么 abccba 是回文串。

 

#include<bits/stdc++.h>
using namespace std;

int main(){

    string s;
    while(cin >> s){

        int len = s.size();
        int ans_left = 0, ans_right = 0; // 最长回文串的左下标和右下标

        // 奇回文串
        for(int i = 0; i < len; i ++){
            int l = i, r = i;
            while(l >= 0 && r < len && s[l] == s[r]){
                l --;
                r ++;
            }

            // l + 1 和 r - 1才是正确下标
            if(r - l - 1 > ans_right- ans_left + 1){
                ans_left = l + 1;
                ans_right = r - 1;
            }
        }

        // 偶回文串
        for(int i = 0; i < len - 1; i ++){
            int l = i, r = i + 1;
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发