package review1;
/**使用暴力法解决最长回文子串的问题
* @author Babulakaka
* @create 2021-06-13 10:27
*/
public class Solution {
public static void main(String[] args) {
String s = longest("abcakjsndabbba");
System.out.println(s);
}
public static String longest(String s){
int len = s.length();
if(s.length()<2){
return s;
}
int begin=0;
int maxLen=1;
char[] chars = s.toCharArray();
for(int i =0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(j-i+1>maxLen&& isHuiWen(chars,i,j)){
begin=i;
maxLen=j-i+1;
}
}
}
return s.substring(begin,begin+maxLen);
}
public static boolean isHuiWen(char []chars,int left,int right){
while (left<right){
if(chars[left]!=chars[right]){
return false;
}
left++;
right--;
}
return true;
}
}
package Review2;
import java.util.concurrent.Callable;
/**使用中心扩散法实现求最长回文子串
* @author Babulakaka
* @create 2021-06-13 10:47
*/
public class Solution {
public static void main(String[] args) {
String s = longest("abcakjsndabbba");
System.out.println(s);
}
public static String longest(String s){
int len = s.length();
if(s.length()<2){
return s;
}
int begin=0;
int maxLen=1;
char[] chars = s.toCharArray();
for(int i=0;i<len-1;i++){
int oddLen = expandAroundCenter(chars,i,i);//奇数最长回文子串
int evenLen = expandAroundCenter(chars,i,i+1);//偶数最长回文子串
int curMaxLen = Math.max(oddLen,evenLen);//判断最长
if(curMaxLen>maxLen) {
maxLen = curMaxLen;
begin = i - (maxLen - 1) / 2;
}
}
return s.substring(begin,begin+maxLen);
}
public static int expandAroundCenter(char[]chars,int left,int right){
int len = chars.length;
int i = left;
int j = right;
while (i>0&&j<len){
if(chars[i]==chars[j]){
i--;
j++;
}else {
break;
}
}
//跳出while循环时,恰好满足s.charAt(i)!=s.charAt(j),
//回文串的长度是j-i+1-2=j-i-1;
return j-i-1;
}
}
package Review2.s;
/**使用动态规划完成求最长回文子串
* @author Babulakaka
* @create 2021-06-13 11:02
*/
public class Solution {
public static void main(String[] args) {
String s = longest("abcakjsndabbba");
System.out.println(s);
}
public static String longest(String s){
int len = s.length();
if(s.length()<2){
return s;
}
int begin=0;
int maxLen=1;
char[] chars = s.toCharArray();
//dp[i][j] 表示s[i...j]是否为回文串
boolean [][] dp = new boolean[len][len];
for(int i=0;i<len;i++){
dp[i][i] =true;
}
for(int j=1;j<len;j++){
for(int i =0;i<j;i++){
if(chars[i]!=chars[j]){
dp[i][j]=false;
}else{
if(j-i<3){
dp[i][j]=true;
}else{
dp[i][j]=dp[i+1][j-1];
}
}
//只要dp[i][j]==true成立,就表示s[i...j]是回文,此时记录回文长度和起始位置
if(dp[i][j]&&j-i+1>maxLen){
maxLen=j-i+1;
begin=i;
}
}
}
return s.substring(begin,begin+maxLen);
}
}