例如:
输入: babad
输出:bab 或 aba
输入:cbbd
输出:bb
import java.util.*;
public class maxSubString {
// 获取最长回文子字符串
public static void main(String []Args){
String strOri = "cbbd";
ArrayList <String> subStrs = new ArrayList();
String result ="";
// 获取所有子串
for(int i=0;i<strOri.length();i++){
for(int j=i+1;j<=strOri.length();j++){
String subStr = strOri.substring(i,j);
subStrs.add(subStr);
}
}
StringBuilder strRe = new StringBuilder(strOri);
strRe.reverse();
// 在逆序的字符串中查找
for(String sub :subStrs){
if(strRe.indexOf(sub)!=-1){
if(result.length()<sub.length()){
result=sub;
}
}
}
if(result!=""){
System.out.println(result);
}else{
System.out.println("输入字符串中未出现回文子字符串");
}
}
}
2020.12.23 回顾这道题
时间几个月,重新回来看这道题,原来有一种情况没有考虑到,例如 aacashihfiahiacaa ,此时会输出 aaca ,可是 aaca并不是回文字符串,只是恰巧原字符串中有 “aaca”字符串的逆序。
看了官方的题解,有个 “动态检测”的解法(时间和空间复杂度都是 O(n^2) )感觉很好。核心的计算思路是,一个回文字符串(长度大于2),那么一定满足:
  1. 起始和末尾的两个字符相等
  2. 除去起始和末尾两个字符后的子字符串是回文字符串
所以,验证一个字符串是否是回文字符串,首先看首尾两个字母是否相等,其次看去掉首尾两个字符的子字符串是否是回文字符串
那么解法有了
class Solution {
public String longestPalindrome(String s) {
int length = s.length();
// 存放是否是回文字符串的结果
Boolean[][] result = new Boolean[length][length];
String subStr = "";
for(int subLen =0 ; subLen < length ; subLen++){
for(int index =0;index + subLen < length ; index++){
int subEnd = index +subLen;
//子字符串长度为1,可以称为回文字符串
if(subLen ==0){
result[index][subEnd] = true;
//子字符串长度为2,只需判断首尾两个字符是否相同
}else if(subLen ==1){
result[index][subEnd] = (s.charAt(index) == s.charAt(subEnd));
//子字符串长度大于2,需要满足两个条件:1首尾字符相同 2除去首尾两个字符后的子字符串是回文字符串
}else{
result[index][subEnd] = (s.charAt(index) == s.charAt(subEnd) && result[index+1][subEnd-1]);
}
// 与当前最长回文字符串做对比
if(result[index][subEnd] && subLen +1 > subStr.length()){
subStr = s.substring(index,index+subLen+1);
}
}
}
return subStr;
}
}
一道小算法题,琢磨琢磨有点儿意思,做这些小算法题,一般会有一个体会,你会的可能比你以为的多那么一点点儿。。。。(最后也有可能发现自己有多渣,哎。。。。。。,)突然感觉没脸要赞了,随缘吧,朋友们