05最长回文子串

leetcode05:05最长回文子串]

题目描述

给定一个字符串 s,找到 s 中最长的回文子串

Example: 输入: "babad"
return :
输出: "bab","aba" 也是一个有效答案

solution idea

中心扩展法

回文中心的两侧互为镜像。因此,回文可以从他的中心展开,并且只有 2n-1 个这样的中心(一个元素为中心的情况有 n 个,两个元素为中心的情况有 n-1 个)

class Solution {
public:
    string center_spread(string s ,int size , int start, int end)
    {
        while(start>=0 && end<size && (s[start]==s[end]))
        {
            start--;
            end++;
        }
        return s.substr(start+1,end-start-1);
    }
    string longestPalindrome(string s) {
        int length=s.size();
        if (length==0) return "";
        string max_str=s.substr(0,1);
        string cur_str,odd_str,even_str;
        for(int i=0;i<length;i++)
        {
            odd_str=center_spread(s,length,i,i);//一个元素为中心
            even_str=center_spread(s,length,i,i+1);//两个元素为中心
            cur_str=( odd_str.size()>even_str.size() ) ? odd_str : even_str;
            max_str=( max_str.size()>cur_str.size() ) ? max_str : cur_str;
        }
        return max_str;
    }
};

c++ 语法

string 切片操作

string substr(int pos = 0,int n ) const;

参数说明:

参数1:pos是必填参数

参数2:n是可参数,表示取多少个字符,不填表示截取到末尾
函数功能返回从pos开始的n个字符组成的字符串,原字符串不被改变

string center_spread(string s ,int size , int start, int end)
{
    while(start>=0 && end<size && (s[start]==s[end]))
    {
        start--;
        end++;
    }
    return s.substr(start+1,end-start-1); // 截取 回文子串
}

python 实现

class Solution():
    def center_spread(self,s,size,left,right):
        l,r=left,right
        while l>=0 and r<size and s[l]==s[r]:
            l-=1
            r+=1
            
        return s[l+1:r],r-l-1
        
    def longestPalindrome(self, s):
        length=len(s)
        if length==0:
            return ""
        max_len=1#至少是一
        max_str=s[0]
        for i in range(length):
            odd_str,odd_len=self.center_spread(s,length,i,i)
            even_str,even_len=self.center_spread(s,length,i,i+1)   
            if odd_len>even_len:
                cur_len=odd_len
                cur_str=odd_str
            else:
                cur_len=even_len
                cur_str=even_str
            if cur_len>max_len:
                max_len=cur_len
                max_str=cur_str
        return max_str

if __name__=="__main__":
    s_test="babad"
    sol=Solution()
    result=sol.longestPalindrome(s_test)
    print(result)

参考文献

  1. c++ prime 第5版
  2. c++ 标准库
  3. devdocs
  4. c++截取字符串
发布了65 篇原创文章 · 获赞 1 · 访问量 3888

猜你喜欢

转载自blog.csdn.net/qq_41918762/article/details/104081904