最长回文子串

zhouzihong 2021-07-25 原文


最长回文子串

最长回文子串

输入一个字符串,找到回文、子串、最长,输出任意一个
 

 

 详细思路

对于每一个起点,向右找到每一个终点,取出子串,比较翻转前和翻转后是否相同,相同更新答案,复杂度n3
 
精确定义
i子串起点
j子串终点
str1翻转前子串
str2翻转后子串
ans最长回文子串之一
class Solution {
public:
    string longestPalindrome(string s) {

        string ans="";
        ans.push_back(s[0]);
        for(int i=0;i<s.size();i++){
            for(int j=i+1;j<s.size();j++){
                string str1,str2;
                str1=str2=s.substr(i,j-i+1);
                reverse(str2.begin(),str2.end());
                if(str1==str2)ans=(str1.size()>ans.size()?str1:ans);
            }
        }
        return ans;

    }
};
踩过的坑
substr需要起点和长度
 
详细思路
某一段子串可以从内部的子串转换过来,只需要两头相同,复杂度n2
 
精确定义
dpij i为第一个元素,j为最后一个元素的子串是否为回文子串
ans_i回文子串最长的第一个元素
ans_len回文子串最长长度
len当前遍历的长度
 
状态转移
a – – a dpij=dp i+1 j-1
a – – b dpij=false
 
初始化
dpii 一个元素=true
dpi i-1空子串=true
小于2个元素直接返回
 
遍历顺序
长度从小到大,再找到每个起点
 
class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        if(n<2)return s;
        int ans_i=0,ans_len=1;
        vector<vector<bool>>dp(n,vector<bool>(n));
        for(int i=1;i<n;i++){
            dp[i][i]=true;
            dp[i][i-1]=true;
        }
        dp[0][0]=true;
        for(int len=2;len<=n;len++){
            for(int i=0;i+len-1<n;i++){
                int j=i+len-1;
                if(s[i]==s[j]){
                    dp[i][j]=dp[i+1][j-1];
                    if(dp[i][j]&&len>ans_len)ans_i=i,ans_len=len;
                }
                else dp[i][j]=false;
            }
        }
        return s.substr(ans_i,ans_len);
    }
};
踩过的坑
        for(int len=2;len<=n;len++){//如果从起点、终点遍历,会有断层dp0 4会发现dp 1 3还没有
            for(int i=0;i+len-1<n;i++){
 
详细思路
遍历扩展起点,从1个和2个字符左右扩展,返回扩展后的回文串起点终点更新答案,小于二先返回
 
精确定义
ans_beg最长回文子串的第一个元素
ans_end最长回文子串的最后一个元素
i i 一个字符开始扩展的起点终点
i i+1两个字符开始扩展的起点终点
beg1 end1一个字符扩展后回文串的第一和最后元素
beg2 end2两个字符扩展后回文串的第一和最后元素
beg end扩展中的回文串的第一和最后元素
 
class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        if(n<2)return s;
        int ans_beg=0,ans_end=0;
        for(int i=0;i<n;i++){
            auto [beg1,end1]=expand(s,i,i);
            if(end1-beg1>ans_end-ans_beg)ans_beg=beg1,ans_end=end1;
            if(i+1<n&&s[i]==s[i+1]){
                auto [beg2,end2]=expand(s,i,i+1);
                if(end2-beg2>ans_end-ans_beg)ans_beg=beg2,ans_end=end2;
            }
        }
        return s.substr(ans_beg,ans_end-ans_beg+1);
    }
    pair<int,int>expand(const string&s,int beg,int end){
        while(beg-1>=0&&end+1<s.size()&&s[beg-1]==s[end+1])beg--,end++;
        return {beg,end};
    }
};

 

 
 
发表于
2021-07-25 20:50 
offer快到碗里来~ 
阅读(0
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhouzihong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhouzihong/p/15058979.html

最长回文子串的更多相关文章

  1. [LeetCode] 5. Longest Palindromic Substring 最长回文子串

           本题求给定字符串的最长回文子串,首先可以想到使用暴力的方法,求出给定字符串的所有的回文子串的长度 […]...

  2. 最长回文子串 (动态规划法、中心扩展算法)

    问题描述: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。 思考: 嗯 […]...

随机推荐

  1. 点货网 x mPaaS | 仅 2 位 Java 开发,使用小程序上线一款 App

    Java “司机”上路指南 一次真正意义上的低成本技术架构升级。   项目背景  衡东点货网是根据物流行业发展 […]...

  2. xml与object 之间的ORM

    xml与object 之间的ORM   xml映射为object对象,同时object对象,以xml来表示: […]...

  3. 基于Windows环境下Myeclipse10.0下载安装破解及jdk的下载安装及环境变量的配置 MyEclipse10.0 注册破解步骤

    jdk的安装及环境变量的配置 1、安装JDK开发环境 附上jdk安装包的百度云链接 链接:http://pan […]...

  4. LED显示器和LCD显示器的对比

       LED显示器与LCD显示器相比,LED在亮度、功耗、可视角度和刷新速率等方面,都更具优势。LED与LCD […]...

  5. 数据库基础学习1-简介

    一、数据库简介   数据库:分为 层次型,网状型,关系型。现在通常都是使用关系型。SQL Server 是一种 […]...

  6. Windows7 下设置电脑做手机 WIFI 热点

    有时候开发过程中需要手机真机去联网实现测试或者下载对应的 APP,有些朋友或许还喜欢将电脑设置为手机的 WIF […]...

  7. VS2010与matlab R2011b混合编程遇到问题及解决

    1.要生成C++动态链接库,在matlab命令窗口中输入: >> mcc -W cpplib:Co […]...

  8. 如何下载火山小视频-附火山小视频下载youtube视频下载网站

    火山小视频下载方法: 1. 打开火山小视频APP 2. 点开某个视频,点击右下角分享按钮,在分享弹框中点击复制 […]...

展开目录

目录导航