最长回文子串

题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

想到回文串,应该联想到双指针。一头一尾的指针不停的移动比对,当出现了首尾的字符不同时,则记录此时回文串的长度。
由于此题是找最长的回文串,所以我们可以遍历每个字符,以当前遍历的字符为中心,用两个指针向远离的方向一头一尾移动。同时,在遍历的同时更新最长的回文串。
很遗憾,在提交测试后,这样的做法没有通过。
主要是因为s的长度为奇数和偶数的区别。
故针对奇数和偶数的情况分别处理,这样就不会漏处理相关场景了。

首先,写一个返回以某个中点向两边扩散的方法。

// left与right是两个指针,起始状态left与right两个指针是靠拢的(传值控制)
public String palindrome(String s, int left , int right) {
	// 从中心往两头走
	while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
		// 向两边走
	    left--;
	    right++;
	}
	
	// 返回此时最长的回文串
	return s.substring(left + 1, right);
}

然后,以为每个字符为中心来计算回文串。

public String longestPalindrome(String s) {
     if (s == null || s.length() == 0) {
         return s;
     }
     String res = "";
     for (int i = 0; i < s.length(); i++) {
     	// 每次以i为中心向外扩散
     	
     	// 处理s的长度为奇数的情况
         String s1 = palindrome(s, i, i);
         // 处理s的长度为偶数的情况, 这个处理很重要。(例如s为abba的情况,s1计算的结果是0,而实际情况是4。s2的计算补齐了这个场景)
         String s2 = palindrome(s, i, i + 1);

		// 再遍历的过程中更新长度
         res = s1.length() >= res.length() ? s1 : res;
         res = s2.length() >= res.length() ? s2 : res;
     }

     return res;
}

此题,主要是要联想到双指针以及注意字符串奇偶长度的处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值