今天的题目是最长回文子串,自己考虑的方法就是暴力法啦,对短一点的输入还好说,过长的字符串自然就超时,虽然我本地能跑出来。
暴力法思路:遍历字符串得到所有子串(用的循环),然后对每个字符串判断是否满足回文的条件(还是循环),对于回文子串还得取最长的。以下是代码:
class Solution {
public String longestPalindrome(String s) {
//对s的每一个子串做出判断
//这里针对它的测试用例如s="a",最后结果也为a添加
if(s.length()<=1){
return s;
}
String ss="";
String subString ="";
//第一,二个for遍历s的所有子串
for(int head=0;head<s.length();head++){
ss=ss+s.charAt(head);
for(int i=head+1;i<s.length();i++){
ss=ss+s.charAt(i);
int l=ss.length();
int flag=0;
//第三个for对当前子串遍历
for(int j=0;j<l/2;j++){
int k=ss.length()-j-1;
if(ss.charAt(j)!=ss.charAt(k)){
break;
}else{
flag+=1;
}
}
if(flag==l/2){
if(subString.length()<ss.length())
subString= ss;
}
}
ss="";
}
if("".equals(subString)){
subString=subString+s.charAt(0);
}
return subString;
}
}
动态规划的方法,看官方解答的思路没有看懂,主要是公式很容易理解到那时具体怎么写有点模糊,参考https://blog.csdn.net/mine_song/article/details/69388525这篇博客跟着他的代码思路才捋清楚。实在捋不清可以把代码放在本地debug慢慢理解。
class Solution {
public String longestPalindrome(String s) {
// 动态规划法
int len=s.length();
if("".equals(s)||len<=0){
return s;
}
int[][] dp= new int[len][len];
char[] cs = s.toCharArray();
int index=0;
int max=1;
//单个字符回文
for(int i=0;i<len;i++){
dp[i][i]=1;
index=i;
}
//两个字符回文
for(int i=0;i<len-1;i++){
if(cs[i]==cs[i+1]){
dp[i][i+1]=1;
index=i;
max=2;
}
}
//三个及以上字符回文
for(int l=3;l<=len;l++){
for(int i=0;i<len-l+1;i++){
//对字符串进行回文判断
int j=i+l-1;
if(cs[i]==cs[j]&&dp[i+1][j-1]==1){
dp[i][j]=1;
max=l;
index=i;
}
}
}
return s.substring(index,index+max);
}
}
中心扩散法:没看懂,官方题解的2n-1个中心到底是啥,等我明天琢磨,太冷了手僵了TAT。另外今天上班被同事指导到不经意扎我心一遍又一遍,菜鸡就菜鸡呗,慢慢来不要急。