Leetcode 5:最长回文子串(Longest Palindromic Substring)
**主要思想:**一旦在一个回文串的两端对称地加上相同元素,那么新形成的字符串仍然是一个回文串。
方法:设定两个下班,从左往右扫描,一旦i和j下标重合,那么i下标移动到头部,从头开始扫描,j下标向后移动一个元素。
当i和j下标指向的元素相等时。判断这两个下标是否相邻或除去这两个元素,剩下的字符是否是回文串,如果是,那么计算当前回文串的长度与之前的最长回文串进行比较,大于就更新最长回文串;如果不是,就继续扫描。
视频地址(https://www.bilibili.com/video/BV124411X7Ly)
public class Solution {
public static String longstPalindrome(String s){
char[] chars = s.toCharArray();
int size = s.length();
if(size==0)
return s;
boolean[][] dp= new boolean[size][size];//用存存s的i到j是否为回文串的状态
int maxlength=1,begin=0;
for(int i=0;i<size;i++) {
for(int j=0; j<size; j++){
if(i==j)
dp[i][j]=true;
else
dp[i][j]=false;
}
}
for(int j=0; j<size;j++){
for(int i=0; i<j;i++){
if(chars[i]==chars[j]&&(i+1==j||dp[i+1][j-1])) {
dp[i][j]=true;
}
if(dp[i][j]&&j-i+1>maxlength){
maxlength=j-i+1;
begin=i;
}
}
;
}
return s.substring(begin, begin+maxlength);
}
public static void main(String[] args) {
String str="abccbd";
String s=longstPalindrome(str);
System.out.println(s);
}
}