最大回文查找

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);
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值