回文算法
转自博客,记录一下
public class GetHuiwen {
public String insertHelperChar(String str){
char[] chars = str.toCharArray();
StringBuffer sb = new StringBuffer();
for(char achar:chars){
sb.append("#").append(achar);
}
//#b#a#a#a#b#a#a#a#c#a#a#
String result = sb.append("#").toString();
System.out.println(result);
return result;
}
public String getLongestHuiwen(String str){
str = this.insertHelperChar(str);
int rightSide = 0;
int rightSideCenter = 0;
int[] allCharHuiwenSide = new int[str.length()];
int longestSide = 0;
int longestCenter = 0;
for(int i = 0 ;i<str.length();i++){
boolean needCal = true;
System.out.println("i:"+i+",rightSide:"+rightSide);
if(rightSide > i){
//求对称值
int leftCenter = 2*rightSideCenter - i;
System.out.println("i:"+i+",left:"+ leftCenter);
allCharHuiwenSide[i] = allCharHuiwenSide[leftCenter];
//没有超过右边界则赋值,并且设置needCal为false
if((i+allCharHuiwenSide[i]) < rightSide){
needCal = false;
}else{
allCharHuiwenSide[i] = rightSide - i;
}
}
if(needCal){
while((i-1-allCharHuiwenSide[i]) >= 0 && (i+1+allCharHuiwenSide[i]) < str.length() ){
// System.out.println(i+":"+(i-1-allCharHuiwenSide[i])+","+(i+1+allCharHuiwenSide[i]));
if(str.charAt(i-1-allCharHuiwenSide[i]) == str.charAt(i+1+allCharHuiwenSide[i])){
allCharHuiwenSide[i]++;
}else{
break;
}
}
rightSide = i + allCharHuiwenSide[i];
rightSideCenter = i;
}
// System.out.println(rightSideCenter+",rightSide:"+rightSide);
if(allCharHuiwenSide[i] > longestSide){
longestSide = allCharHuiwenSide[i];
longestCenter = i;
}
}
String result = str.substring(longestCenter-longestSide,longestCenter+longestSide+1);
for(int i = 0;i<allCharHuiwenSide.length;i++){
System.out.println(i+":"+allCharHuiwenSide[i]);
}
// System.out.println(longestCenter);
// System.out.println(longestSide);
// System.out.println();
return result;
}
public static void main(String[] args) {
GetHuiwen ghw = new GetHuiwen();
// String str = "abcdbabcbaaa";
String str = "cbaaa";
// System.out.println(ghw.insertHelperChar(str));
// //#a#b#c#d#b#a#b#c#b#a#a#a#
// ghw.getLongestHuiwen(str);
String[] testStrArr = new String[] {
// "abcdcef",
// "adaelele",
// "cabadabae",
// "aaaabcdefgfedcbaa",
// "aaba",
"baaabaaacaa"
};
for(String str : testStrArr) {
System.out.println(String.format("原字串 : %s", str));
System.out.println(String.format("最长回文串 : %s", ghw.getLongestHuiwen(str).replace("#", "")));
System.out.println();
}
}
}