暴力解法
直接判断每一个子串是不是回文子串,然后取其中最长的值返回
public class Palindrome { public int getLongestPalindrome(String A, int n) { int maxLen = 0; //暴力解法 for(int i = 0; i < n; i++){ for(int j = i+1; j <= n; j++){ String now = A.substring(i,j); if(isPalindrome(now) && now.length() > maxLen){ maxLen = now.length(); } } } return maxLen; } //判断子串是不是回文子串 public boolean isPalindrome(String s){ int l = s.length(); for(int i = 0; i < l/2; i++){ if(s.charAt(i) != s.charAt(l-i-1)) return false; } return true; } }
中心扩散法
public class Palindrome { public int getLongestPalindrome(String A, int n) { if(n == 0) return 0; int maxLen = 1; //中心枚举到n-2位置 for(int i = 0; i < n-1; i++){ // 比较以i为中心扩散的回文子串 && 以i和i+1为中心扩散的回文子串 哪个大取哪个 int len = centerSpread(A,i,i) > centerSpread(A,i,i+1)? centerSpread(A,i,i):centerSpread(A,i,i+1); maxLen = Math.max(maxLen,len); } return maxLen; } //若left==right 则扩散中点为一个,此时的回文子串为奇数 //若left!=right,则扩散的中点为 left和right,此时的回文子串为偶数 public int centerSpread(String s, int left, int right){ int len = s.length(); int l = left; int r = right; while(l >= 0 && r <= len-1){ //若相等则继续扩散 if(s.charAt(l) == s.charAt(r)){ l--; r++; }else{ break; } } //为什么还要减2 因为上面while循环终止了,此时s.charAt(l) != s.charAt(r) //所以此时的回文子串的左右边界其实是 l-1, r-1 return r-l+1-2; } }