思想 :
总共有2n-1 个中间点 n 个 字符 n -1 个字符;
取字符串的一个中间点向左右两边扩散,如果左边字符等于右边字符,则是当前截取的字符串回文
再继续 left – , right ++ ;
查看每个节点的回文是否存在,存在则将该回文保存。后面回文长度和前面的回文长度比较 取最大的回文长度。
/** 求字符串最长回文序列
* @author yezhiming
*2019年9月30日
*@version
*/
public class HuiWenString {
public static void main(String[] args) {
String s = "asdfgfdsavcxz";
HuiWenString huiWenString = new HuiWenString();
String longestPalindrome =huiWenString.longestPalindrome(s);
System.out.println(longestPalindrome);
}
public String longestPalindrome(String s) {
if(s.length()==0|| s.equals("")){
return "";
}
//字符串的回文起始位置
int start = 0;
//回文的结束位置
int end = 0;
//有 2n -1 个中心点
for (int i = 0; i < s.length(); i++) {
//取字符串的一个点
int centerExpand = centerExpand(s, i, i);
//取字符串的两个字符中的一个中间点
int centerExpand2 = centerExpand(s, i, i+1);
int len = Math.max(centerExpand, centerExpand2);
//找到最大的回文子串
if (len > end - start) {
start = i -( len -1 )/2;
end = i + len/2;
}
}
//substring 为 左闭右开
return s.substring(start, end+1);
}
/*
* 从一个点向两边扩展 只要两边的字符串为同一个字符 则也是回文
* 返回回文字符长度
*/
public int centerExpand(String s,int left,int right){
int L = left;
int R = right;
while(L >=0 && R< s.length()&& s.charAt(L)==s.charAt(R)){
L --;
R ++;
}
return R-L-1;
}
}