【PAT甲级真题】- Longest Symmetric String (25)

题目来源

Longest Symmetric String (25)

题目描述

Given a string, you are supposed to output the length of the longest

symmetric sub-string. For example, given "Is PAT&TAP

symmetric?", the longest symmetric sub-string is "s

PAT&TAP s", hence you must output 11.

输入描述:

Each input file contains one test case which gives a non-empty string of length no more than 1000.

输出描述:

For each test case, simply print the maximum length in a line.

输入例子:

Is PAT&TAP symmetric?

输出例子:

11

思路简介

最长回文有两种写法

  • 中心扩展法:最常用也是最简单好理解的方法,O(n^2)
  • Manacher算法:可以 O(n) 求出所有位置的最长回文串,一般用于多组询问,实际工程上效率可能不如中心扩展

我只简单介绍中心扩展法:

顾名思义,就是从当前位置向两边扩展

用左右指针维护,相同就左指针左移,右指针右移继续比较,不同就退出取最大值

注意

  • 回文有奇回文和偶回文之分,我这里用一个函数就可以区别,可以参考一下代码
  • 指针不能越界

遇到的问题

  1. 没分奇偶回文wa了一次

代码

cpp 复制代码
/**
 * https://www.nowcoder.com/pat/5/problem/4027
 * 最长回文
 */
#include<bits/stdc++.h>
using namespace std;

int expand(string s,int l,int r){
    int len=s.size(),mx=0;
    while(l>=0&&r<len&&s[l]==s[r])l--,r++;
    
    return r-l-1;
}

void solve(){
    string s;
    getline(cin,s);
    int len=s.size(),mx=0;
    for(int i=0;i<len;++i){
        mx=max(expand(s,i,i),mx);//奇回文
        mx=max(expand(s,i,i+1),mx);//偶回文
    }
    cout<<mx;
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //fstream in("in.txt",ios::in);cin.rdbuf(in.rdbuf());
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
相关推荐
To_OC3 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC3 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK5 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境17 小时前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
_清歌18 小时前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法
统计实现局18 小时前
SVD 的三步走:双对角化、Givens 收敛、排序
算法
躬行见万象18 小时前
《VLA 系列》UniLab 强化训练 | G1 机器人 |复现
算法
统计实现局18 小时前
对称不定分解(Bunch-Kaufman):为什么 Cholesky 不够用
算法
统计实现局18 小时前
dqrsl 拆解:拿着 QR 结果能算出哪 5 种东西
算法