73.对称字符串的最大长度(字符串)。
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。
package com.algo.ms;
public class SymmetricMax73 {
public int findMaxSysmmetricNum(char[] arr){
int max = 0;
for(int start = 0 ; start < arr.length - 1; start++){
int num = 0;
for(int i = start, j = arr.length - 1; i <= arr.length -1 && i <= j && j >=0;){
if(arr[i] == arr[j]){
if( i == j){
i++;
j--;
num ++;
}else{
i++;
j--;
num = num + 2;
}
}else if(arr[i] != arr[j]){
j--;
num = 0;
}
if(max < num) max = num;
}
}
return max;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SymmetricMax73 sym = new SymmetricMax73();
String str = "egohoge";
char[] arr = str.toCharArray();
System.out.println(sym.findMaxSysmmetricNum(arr));
}
}
package com.algorithm.coding.puzzles;
public class LongestPalindrome50 {
public String longestPalindrome(String str){
int len = str.length();
char[] c = str.toCharArray();
int[][] p = new int[len][len];
int maxL = 0,tempLen;
int start = 0, end = 0;
for(int i=0; i < len; i++){
for(int j=0; j <= i; j++){
if(c[i] == c[j] && (i - j < 2 || p[j+1][i-1] == 1))
p[j][i] = 1;
if(p[j][i] == 1){
tempLen = i - j + 1;
if(tempLen > maxL){
maxL = tempLen;
start = j;
end = i;
}
}
}
}
return str.substring(start, end + 1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abccb";
LongestPalindrome50 longest = new LongestPalindrome50();
System.out.println(longest.longestPalindrome(str));
}
}