首页 > 其他分享 >5-Longest Palindromic Substring-最长回文串

5-Longest Palindromic Substring-最长回文串

时间:2024-05-20 22:31:06浏览次数:31  
标签:Palindromic int Substring Longest str rn size dp 回文

问题描述

链接: https://leetcode.com/problems/longest-palindromic-substring/description/

Given a string s, return the longest  palindromic substring in s

解释: 给定一个字符串,求其最长的回文串
回文串:一个字符串,如果从左往右读和从左往右读 读出来的序列是一样的,称之为回文串。比如 aba, 从左往后和从右往左都是 aba

基本思想

构建数组dp, 大小为s的长度。则 \(dp[i]\): 以i为中心的回文串的最大长度。而后依次一s[i]为中心,计算回文串。
如上过程存在如下问题:

  • s的长度为奇数时候可以,为偶数的时候不行,不如bb,此时回文串没有中心。所以要先将 s变换为奇数。变换方式如下:在s的元素之间增加"#"形成新的字符串str。

如上思路还存在如下问题:

  1. 如何区分'#d#' 和 ‘d#d’ ?这两个回文串 明显后者才是正确的,但是其长度是一样的
    1. 增加 一个变量,记录 一个回文串的#的数目

最差时间复杂度O(n^2)

代码

C++

string longestPalindrome(string s) {
         int size = s.size();
         if (size<=1) return s;
         string str; // 将str长度变为奇数
        for(int i=0;i<(size-1);++i) {
            str += s[i];
            str += '#';
        }
        str += s[size-1];
         vector<int> dp(str.size(),1); // 以str[i]为中心的最长回文串的长度
         int res = 1;
         int index = 0;
         int r_count = 0;
         for(int i=1; i<str.size();++i) {
            int x = i-1;
            int y = i + 1;
            int count=0;
            if (str[i] == '#') ++count;
            while(x>=0 && y<str.size() && str[x]==str[y]) {
                dp[i]=dp[i]+2;
                if(str[x] == '#') 
                  count = count+2;
                --x;
                ++y;
            }
            if ((res-r_count)<(dp[i]-count)) {
                res = dp[i];
                index = i;
                r_count = count;
            }
         }
         string s1;
         int i = index - res/2; 
         while(i<=(index+res/2)) {
            if (str[i]!='#') {
                s1 += str[i];
            }
            ++i;
         }
        return s1;
    }

python

 def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n<=1: return s
        str=''
        for i,ele in enumerate(s):
            str += ele
            if  i != (n-1):
                str += '#'
        dp = [1] * len(str)
        maxLength = 1
        index = 0
        count = 0
        for i in range(1,len(str)):
            x = i-1
            y = i+1
            rn = 0
            if str[i] == '#':
                rn = 1
            while x >= 0 and y < len(str) and str[x] == str[y]:
                if str[x] == '#':
                    rn = rn+ 2
                x = x-1
                y = y +1
                dp[i] = dp[i] + 2
            if (maxLength-count) < (dp[i] - rn):
                maxLength = dp[i]
                index = i
                count = rn
        s1 = ''
        i = index - maxLength//2
        while i<=(index+ maxLength//2):
            if str[i] != '#':
                s1 += str[i]
            i=i+1
        return s1 

标签:Palindromic,int,Substring,Longest,str,rn,size,dp,回文
From: https://www.cnblogs.com/douniwanli/p/18202936

相关文章

  • LeetCode 1915. Number of Wonderful Substrings
    原题链接在这里:https://leetcode.com/problems/number-of-wonderful-substrings/description/题目:A wonderful stringisastringwhere atmostone letterappearsan odd numberoftimes.Forexample, "ccjjc" and "abab" arewonderful,but "ab&......
  • ABC240Ex Sequence of Substrings
    ABC240ExSequenceofSubstringsLIS的好题改编。约定\(S(l,r)\)为字符串\(s\)中第\(l\)位到底\(r\)​位。\(S(l,r)<S(x,y)\)为字符串中\([l,r]\)的子串字典序比\([x,y]\)的子串小。前置LIS的\(n\logn\)求法。题解我们考虑按照类似于朴素LIS的方式设状......
  • ABC347B Substring
    题目描述给你一个由小写英文字母组成的字符串S,S有多少个不同的非空子串?子串是连续的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。数据范围:S是长度在1和100之间(含)的字符串,由小写英文字母组成。题解我认为这道题放在普及组的话,非常适合放在第一题和第二题之间,......
  • js substr 与 substring 有什么区别吗
    在JavaScript中,substr和substring是用于提取字符串的两个方法,它们的功能类似,但有一些区别:1.substr(start,length)方法:参数:start:必需。要提取的子字符串的起始位置。如果为负数,表示从字符串末尾开始计数。length:可选。要提取的字符数。如果省略或为负数,则提取到字符......
  • JavaScript实现文件大小转换、单位转换、toFixed、indexOf、substr、substring、B、KB
    constbytesToSize=(size)=>{if(size<0.1*1024){//小于0.1KB,则转化成Bsize=size.toFixed(2)+'B'}elseif(size<0.1*1024*1024){//小于0.1MB,则转化成KBsize=(size/1024).toFixed(2)+'KB'}else......
  • LeetCode in Python 300. Longest Increasing Subsequence (最长递增子序列)
    求最长递增子序列是深度优先搜索(DFS)的一种应用,有两种比较好的方法可以解决。第一种是动态规划法,时间复杂度为O(n*n),即设置边界条件和更新迭代公式求解最优解。第二种使用二分查找将时间复杂度降为O(nlogn)。本文给出两种方法的实现代码及说明。示例:图1最长递增子序列输入......
  • D. Non-Palindromic Substring
    D.Non-PalindromicSubstringAstring$t$issaidtobe$k$-goodifthereexistsatleastonesubstring$^\dagger$oflength$k$whichisnotapalindrome$^\ddagger$.Let$f(t)$denotethesumofallvaluesof$k$suchthatthestring$t$is$k$-good.Yo......
  • 从 String.prototype.substring 的区间开始
    因为使用String.prototype.substring(start,end)或者Array.prototype.slice(start,end)的时候偶尔会想不起来这些函数的区间代表的是什么。在这里记录一下。不同函数的差异这些区间都是[start,end),即是包括start,但是不包括end(当没有传入end时,end视为数组或者字符串......
  • 题解 P9981 [USACO23DEC] Minimum Longest Trip G
    【洛谷专栏】题意\(N\)个点\(M\)条边的有向无环图,对于每一个点\(i\)你需要求出一条从\(i\)出发的最长路径且路径上边权组成的序列字典序最小。求每一条路径的长度和边权和。分析最长的路径很好求,在DAG上拓扑排序后动态规划即可。(具体的实现可以参考OI-Wiki)现在的......
  • E. Nearly Shortest Repeating Substring
    #include<iostream>#include<algorithm>#include<cstring>#include<cmath>usingnamespacestd;intn,m;intmain(){ cin>>n; while(n--) { //strings; cin>>m; strings; cin>>s; intres=m; f......