5. 最长回文子串——基于扩展中心法的优化

class Solution {
    public String longestPalindrome(String s) {
    	if (s == null) return null;
    	char[] cs = s.toCharArray();
    	if (cs.length <= 1) return s;
    	// 最长回文子串的长度(至少是1)
    	int maxLen = 1;
    	// 最长回文子串的开始索引
    	int begin = 0;
    	int i = 0;
    	while (i < cs.length) {
    		int l = i - 1;
			// 找到右边第一个不等于cs[i]的位置
    		int r = i;
    		while (++r < cs.length && cs[r] == cs[i]);
    		// r会成为新的i
    		i = r;
    		
    		// 从l向左,从r向右扩展
    		while (l >= 0 && r < cs.length && cs[l] == cs[r]) {
    			l--;
    			r++;
    		}
    		
    		// 扩展结束后,cs[l + 1, r)   cs(l, r)就是刚才找到的最大回文子串
    		// ++l后,l就是刚才找到的最大回文子串的开始索引
    		int len = r - ++l;
    		if (len > maxLen) {
    			maxLen = len;
    			begin = l;
    		}
		}
    	return new String(cs, begin, maxLen);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值