最长回文子串

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. 最长回文子串 (动态规划法、中心扩展算法)

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

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

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

随机推荐

  1. 使用Java实现二叉树的添加,删除,获取以及遍历

      一段来自百度百科的对二叉树的解释:   在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被 […]...

  2. 微擎模块开发-小程序微擎模块对接微擎站点(基础篇)

    微擎添加小程序,并与公众号进行对接。 打开微擎站点,点击添加平台。 选择新建微信小程序。 选择手动添加。 填写 […]...

  3. robotframework之滚动条

    robotframework之滚动条 在测试过程中遇到侧边栏以及下拉框中元素超过div长度时,会自动增加滚动条 […]...

  4. Linux下服务器开发的必要准备

    一、Windows下安装Xshell 二、Linux开启SSH   可以先查询有没有SSH服务 sudo ps […]...

  5. (十四–十五)数据库查询优化Part I

    (十四–十五)数据库查询优化Part I 如果理解的有问题。欢迎大家指出。这也是我在看课记得笔记。 […]...

  6. 解决Ubuntu安装VM Tools请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。 – 心默默言

    https://blog.csdn.net/l31299/article/details/71794661...

  7. idea导入jdk源码查看(xjl456852原创)

    idea导入jdk源码查看(xjl456852原创) idea添加了jdk环境后,却无法查看jdk源码,只能通 […]...

  8. Excel同时显示多个独立窗口 – Jacklovely

    Excel同时显示多个独立窗口 2021年2月10日 16:40:07 新安装的office2010,打开两个 […]...

展开目录

目录导航