Longest Palindromic Substring 最长回文子串

之前不知道为什么没太想明白,想明白了之后觉得其实还是挺容易的。大概记录一下思路。

其实就是简单的从两个相同的字符开始找起而已。

第一次找类似于"aa","bb"这样的结构。这里需要注意的就是当判断‘aa’的时候,‘aa’结构对应的是table[i+1][j-1]

举例来说,如果i为0,j为1,也就是table[1][0],当你的原始字串是类似于’aba‘的结构的时候,是不会有这样的问题的,aba的时候,判断table的值得时候会落在b上。而b是自己的回文。所以要提前赋值给table[i][i-1]。

然后接着判断有没有abba这样的结构,然后是abbccbba....就这么一个循环的过程。记录最长就好了。


在网上浏览的时候完全被大家画的矩阵搞晕了。是个矩阵,当你想明白之后看矩阵也会觉得很清晰。但是,我觉得阐述思路是更重要的。

比如

 aa
a11
a01

 这里就是要把最下面那个0变成1

 abceca
a100000
b010000
c001000
e000100
c001010
a000001

很容易看出最长子串在哪里了吧?(为了容易理解我没有加上特殊条件table[i][i-1] = 1)


	private static String findSub(String str) {
		// TODO Auto-generated method stub
		int length = str.length();
		boolean table[][] = new boolean[length][length];
		
		int start=0, end=0,longest = 0;
		
		table[0][0] = true;
		for(int i=1; i < length; i++)
		{
			table[i][i] = true;
			table[i][i-1] = true;//abba这样的substring需要
		}
		
		for(int k = 2; k <= length; k++)//substring length
		{
			for(int i = 0; i <= length-k; i++)
			{
				int j = i+k-1;
				
				if(str.charAt(i)==str.charAt(j) && table[i+1][j-1] == true)
				{
					table[i][j]=true;
					if(longest < k)
					{
						longest = k;
						start = i;
						end = j+1;
					}
				}
			}
		}
		
		str = str.substring(start,end);
		return str;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值