问题描述:
在一个指定的字符串中,查找出最长的回文字符串。例如:abcddcdd中出现的最长的回文串就是:cddc。
实现思路:
(1)从第一个字符开始,同时从左边和右边取一个字符进行比较,如果相同则当前左边+中间+右边组成的字符串是回文,则继续向左向右取字符,直到左和右的字符不同为止。当然第一个字符肯定不构成回文。第二个字符也不满足上面遍历的条件,所以直接从第三个字符取,进行上述的遍历。
(2)已知有判断回文的方法,则对字符串进行字符截取,先从字符串的长度为2开始截取,从左到右,每次截取两个长度的字符串,然后判断该字符串是否为回文,如果是,则此次遍历结束,然后再从字符串长度为3开始截取,同样进行判断截取出来的字符串是否是回文,直到遍历完整个字符串的长度为止。
思路1JAVA实现:
private String getMaxStr(String inputStr) {
String result = "";
if(null != inputStr &&
!"".equals(inputStr) &&
inputStr.length()>=3) {
char[] inputStrArray = inputStr.toCharArray();
String maxStr = "";
int len = inputStrArray.length;
for(int index=0;index<len;index++) {
int start = 1;
String tmpMax = "";
while(index-start >=0 && index + start< len) {
if(inputStrArray[index-start]== (inputStrArray[index+start])) {
tmpMax += Character.toString(inputStrArray[index-start])+Character.toString(inputStrArray[index])+Character.toString(inputStrArray[index+start]);
start++;
}else {
break;
}
}
if(!"".equals(tmpMax) && tmpMax.length()>maxStr.length()) {
maxStr = tmpMax;
}
}
result = maxStr;
}
return result;
}
思路2JAVA实现:
/**
* 判断是否是回文
* @param str
* @return
*/
private boolean isHuiWen(String str) {
boolean flag = true;
if(null != str && !"".equals(str)) {
for(int i=str.length()/2-1;i>=0;i--) {
if(!str.substring(i,i+1).equals(str.substring(str.length()-i-1,str.length()-i))) {
flag = false;
break;
}
}
}else {
flag = false;
}
return flag;
}
/**
* 字符长度从2开始到最大长度,每次判断是否有回文,如果有就留下来。
* @param str
* @return
*/
private String getMaxStr2(String str) {
String result = "";
if(null != str && !"".equals(str) & str.length()>1) {
for(int j = 2;j<=str.length();j++) {
String maxStr = "";
//满足J个长度的字符串个数
for(int i=0;i<=str.length()-j;i++) {
String tmpStr = str.substring(i,i+j);
if(isHuiWen(tmpStr)) {
maxStr = tmpStr;
break;
}
}
if(!"".equals(maxStr) && maxStr.length() == j) {
result = maxStr;
}
}
}
return result;
}