题解 | #最长回文子串#

最长回文子串

https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    string s;
    cin >> s;
    int n=s.size();
    vector<vector<int>> dp(n,vector<int>(n,0));
    for(int i=0;i<n;++i)
        dp[i][i]=1;
    int result=1;
    for(int i=n-1;i>=0;--i){
        for(int j=i+1;j<n;++j){
            if(s[i]==s[j]){
                if(j-i>=2&&dp[i+1][j-1]!=0){
                    dp[i][j]=2+dp[i+1][j-1];
                }
                else if(j-i<=1){
                    dp[i][j]=j-i+1;
                }
                result=max(result,dp[i][j]);
            }
                
        }
    }
    cout << result;
}
// 64 位输出请用 printf("%lld")

#include <cmath>
#include <iostream>
#include <string>
using namespace std;
//遍历字符串,以每个字符为中心,双指针向左右移动,获得回文串的长度。
int extend(const string& s,int left,int right){
    int res=0;
    if(left==right)
        res++;
    else if(left>=0&&right<s.size()&&s[left]==s[right])
        res+=2;
    else
        return res;
    --left;++right;
    while(left>=0&&right<s.size()&&s[left]==s[right]){
        res+=2;
        --left;++right;
    }
        
    return res;
}

int main() {
    string s;
    cin >> s;
    int result=1;
    for(int i=0;i<s.size();++i){
        result=max(result,extend(s,i,i));
        result=max(result,extend(s,i,i+1));
    }
    cout << result;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务