import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 最大回文查找
* 算法思想
* 选定字符串s,以其中轴为中心线,然后左右比较,在有限范围内,中心像两边同时遍历,元素均相等
* 参考链接:
* https://blog.csdn.net/soullines/article/details/80606215
* @author 马宁波
* @date 2019-08-31 14:21:06
*/
public class HuiWen {
/**
* 判断给定到的字符串是否是回文
* 回文定义:
* 如果字符串个数为偶数,那么从中间分割,两个子字符串其中一个反转后与另外一个相等(即,两个字符串对称);
* 如果字符串个数为基数,那么以中间字符为对称轴,两边的字符串其中一个反转后与另外一个相等(即,两个字符串对称)。
* 例如:
* 己11己 己的己 11
* @param s
* @return
* @author 马宁波 2019-08-31 15:03:27
*/
private static boolean isHuiWen(String s) {
int sl = 0;
if (null != s) {
sl = s.length();
}
if (sl <= 1) {
return false;
}else if (sl == 2) {
if(s.charAt(0) == s.charAt(1)) {
return true;
}else {
return false;
}
}else {
if (sl % 2 == 0) {
int mid = sl / 2;
return s.substring(0, mid).equals(new StringBuffer(s.substring(mid)).reverse().toString());
}else {
int mid = (sl + 1) / 2;
return s.substring(0, mid -1).equals(new StringBuffer(s.substring(mid)).reverse().toString());
}
}
}
private static List<String> getHuiWens(String s){
List<String> huiWens = new ArrayList<String>();
if (null != s) {
int al = s.length();
System.out.println(al);
int mid = 0; // 字符串中间位置
if (al % 2 == 0) {
mid = al / 2;
} else {
mid = ((al + 1) / 2) -1;
}
String subString = "";
for (int i = 1; i < al; i++) {
int stop = 0; // 子循环最大值
if (i <= mid) {
stop = i;
}else {
stop = al - i;
}
for (int j = 0; j < stop; j++) {
subString = s.substring(i - j - 1, i + j + 1); // 以索引间隔为中心获取子字符串
System.out.println(i + "\t" + subString);
if (isHuiWen(subString)) {
huiWens.add(subString);
}
if (i + j + 2 <= al) {
subString = s.substring(i - j - 1, i + j + 2); // 以索引位置字符为中心获取子字符串
System.out.println(i + "\t" + subString);
if (isHuiWen(subString)) {
huiWens.add(subString);
}
}
}
}
}
return huiWens;
}
public static void main(String[] args) {
String s = "aabasfsdfsfsdabcddcbaffsdfsfsdfsdgfsas";
System.out.println(s.charAt(0) == s.charAt(1));
System.out.println(isHuiWen("aa"));
System.out.println(isHuiWen("aaa"));
System.out.println(isHuiWen("aba"));
System.out.println(isHuiWen("a"));
System.out.println(isHuiWen("aaaa"));
System.out.println(isHuiWen("aaaaa"));
System.out.println(isHuiWen("babab"));
System.out.println(isHuiWen("babbab"));
s = "己的己11己1";
List<String> huiWens = getHuiWens(s);
Collections.sort(huiWens, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int o1L = o1.length();
int o2L = o2.length();
if (o1L == o2L) {
return 0;
}else if(o1L > o2L) {
return -1;
}else {
return 1;
}
}
});
for (String huiWen : huiWens) {
System.out.println(huiWen);
}
}
}