字符串的最长回文子串问题

解题的具体思路都有相应注释,所以直接上代码

public class Palindrome {
	public static void main(String[] args) {
		Palindrome p = new Palindrome();
		System.out.println(p.getMost("")); //0
		System.out.println(p.getMost("1")); //1
		System.out.println(p.getMost("jdlakjlkljkadlkj"));//9
	}
	public int getMost(String str)
	{
		if(str==null||str.length()==0)
		{
			return 0;
		}
		int max=0,curL=0;
		
		/**
		 * str的回文子串的长度可能为奇数,也有可能为偶数,
		 * 在代码处理时比较麻烦
		 * 因此通过往每个字符的左右两边各插入一个'#'的方式,
		 * 
		 * ==>得到chs, 则chs的回文子串必为奇数
		 * 
		 * 读者朋友可以在纸上画一画,验证上述结论是否成立
		 */
		char []chs = new char[str.length()*2+1];
		int index=0;
		for(;index<str.length();index++)
		{
			chs[2*index] = '#';
			chs[2*index+1] = str.charAt(index);
		}
		chs[2*index]='#';
		
		/**
		 * 接下来采用中心扩展法,
		 * 假设最长回文子串的中心是c=1-->c=chs.length-1的某一个位置,
		 * 
		 * 遍历这些位置,并记录相应的最大长度
		 */
		for(int c=1;c<chs.length-1;c++)
		{
			/**
			 * 假设中心为c
			 * 则以c为中心,以g为半径,向左右两侧发散
			 * 
			 * 左侧临界点为c-g>=0,右侧临界点为c+g<=chs.length-1
			 */
			for(int g=0;(c-g>=0)&&(c+g<=chs.length-1);g++)
			{
				if(chs[c-g]==chs[c+g])
				{
					curL = 2*g+1;
					if(curL>max)
					{
						max = curL;
					}
				}
				else{
					break;
				}
			}
		}
		/**
		 * 因为在长度为max的回文子串,
		 * '#'的个数肯定比实际字符串多1,(max必为奇数)
		 * 所以返回值=max/2
		 */
		return max/2;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值