文章目录
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)