LeetCode查找一个字符串的最长回文子串并返回该子串(中心扩展法)

本文介绍了一种使用中心扩展法寻找字符串中最长回文子串的方法,通过定位中心点并对比其周围字符,有效找出符合回文条件的序列。针对连续相同字符的情况,提出了在字符串中插入特殊字符的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比如一个字符串abcdcbe,则最长的回文子串就应该使bcdcb,即按顺序,倒序读都是一样的。
中心扩展法思路:一个子串是回文序列那么它必定是关于中心点对称的,所以只要找到了中心点,再逐一比较它的前后两个字符,相等就继续延申,不相等就退出找下一个“中心点”。
可能存在的问题:对于中间有连续的字符dcffg,像这样的字符串如果按照上述方法来找就无法找到,但ff是符合条件的,解决的办法就是将字符的左右都加上一个相同的字符‘*’,即字符串的长度变长为2n+1,最后再通过一定的判断就能截取出对应的回文序列。

class Solution {
    public String longestPalindrome(String s) {
		int len=0;
		StringBuffer temp = new StringBuffer();
		String fin="";
        if(s.length()==1){
            return s;
        }
        //将所有的字符左右都加上一个相同的字符
		for(int i=0;i<s.length();i++){
	            temp.append("*");
	            temp.append(s.charAt(i));
	        }
		temp.append("*");
		
		char []str=temp.toString().toCharArray();//将
		for(int i=0;i<str.length-2;i++){
			int temp2=0;
			for(int j=0;j<=i&&j<=(str.length-i-1);j++){//因为只需要比较该中心点左右两边最段的距离(回文序列是对称的)
				if(str[i-j]==str[i+j]){//
					temp2++;//用一个变量来记录长度,这个长度不是真正的截取的字符串的长度,只是为了比较而已。
					if(temp2>len)//如果长度大于以前的长度
					{
                       if(str[i] != '*'){//判断也是为了解决两个字符连着的问题,这只是一个发现的规律而已,当中心点不为*的时候
							fin=s.substring((i-1)/2-j/2, (i-1)/2+j/2+1);
						}
						else{//当中心点为*的时候
							fin=s.substring((i-1)/2-j/2+1, (i-1)/2+j/2+1);
						}
						len=temp2;
					}
				}
				else{//若左右不相等,则寻找下一个中心点
					break;
				}				
			}
		}
	return fin;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值