5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
- 穷举每一个点为中心点,从中心点向两边扩展寻找回文串
- 如果回文串是奇数由最中心的一个节点向两边扩展
- 如果回文串是偶数,由最中心的两个节点向两边扩展
- 迭代比较找最长回文串
- 方式1
class Solution {
public String longestPalindrome(String s) {
//回文最长子串
String res="";
//以任意一个节点为中心向两边扩展
for(int i=0;i<s.length();i++){
//偶数串中间两个节点向外扩展
String s1=extendHuiWen(s,i,i+1);
//奇数串中间一个节点向外扩展
String s2=extendHuiWen(s,i,i);
//求最长回文子串
res=res.length()>s1.length()?res:s1;
res=res.length()>s2.length()?res:s2;
}
return res;
}
public String extendHuiWen(String s,int l,int r){
while(l>=0&&r<s.length()){
if(s.charAt(l)==s.charAt(r)){
l--;
r++;
}else{
break;
}
}
return s.substring(l+1,r);
}
}
- 方式2
class Solution {
public String longestPalindrome(String s) {
String res="";
int len=s.length();
for(int i=0;i<(2*len-1);i++){
int l=i/2;
int r=i/2+i%2;
String curs=extand(s,l,r);
res=res.length()>curs.length() ?res :curs ;
}
return res;
}
public String extand(String s,int l,int r){
while(l>=0&&r<s.length()){
if(s.charAt(l)==s.charAt(r)){
l--;
r++;
}else{
break;
}
}
return s.substring(l+1,r);
}
}
时间复杂度O(n^2)
空间复杂度O(1)
647. 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:“abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:“aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
- 中心扩展
class Solution {
public int countSubstrings(String s) {
int n=s.length();
int res=0;
//0~2n-2 (2n-2)/2才是最后一个元素
for(int i=0;i<2*n-1;i++){
//以任一节点为中心节点向两边扩展
//i为奇数实际才是偶数个元素
//i/2+i%2对于奇偶而言不同
int l=i/2;
int r=i/2+i%2;
while(l>=0&&r<n&&s.charAt(l)==s.charAt(r)){
l--;
r++;
res++;
}
}
return res;
}
}
时间复杂度O(n^2)
空间复杂度O(1)