JAVA L2-008 最长对称字串

本文介绍了如何使用Java编程语言实现中心扩展算法来寻找给定字符串中的最长回文子串,包括charAt()方法的应用以及LPL和expandAroundCenter函数的详细步骤,强调了算法的时间复杂度和代码实现的简洁性。
摘要由CSDN通过智能技术生成

回文这种题还是经常考的

主要还是考对字符处理这一块的内容

如果你能够想到JAVA的charAt()方法,那AC这题基本上没有问题啦

这次做到就多念它两边,因为我一开始就没有想到...

代码思路来自 Micek博主


中心扩展算法

中心扩展算法是用于寻找回文子串的一种常见方法之一。该算法基于一个简单的观察:回文串的中心可能是一个字符,也可能是两个相邻字符之间。因此,对于每个可能的中心,我们向两边扩展,直到无法继续扩展或达到了字符串的边界。

具体步骤如下:

  1. 从字符串的第一个字符开始,遍历每个字符。
  2. 对于每个字符,以其为中心向两边扩展,分别检查奇数长度和偶数长度的回文串。
  3. 在扩展的过程中,一旦发现不再是回文串,就停止扩展。
  4. 在扩展的过程中记录当前回文串的长度。
  5. 继续遍历字符串中的下一个字符,重复以上步骤,直到遍历完整个字符串。

以下可以不看了,反正java就是慢呜呜

这种方法的时间复杂度为 O(n^2),其中 n 是字符串的长度。虽然在最坏情况下的时间复杂度较高,但对于大多数实际输入,这种方法是非常高效的。

好了,那么其实就是我们需要写一个(LongestPalindromeLength)LPL方法,在其中再调用另一个我们需要写的方法expandAroundCenter

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	public static void main(String[] args)throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		System.out.println(LPL(bf.readLine()));
	}
	private static int LPL(String s) {
		if(s == null) return 0;
		
		int start = 0;int end = 0;
		for (int i = 0; i < s.length(); i++) {
			int len1 = expandAroundCenter(s, i, i);  //计算奇回文
			int len2 = expandAroundCenter(s, i, i+1);//计算偶回文
			int len = Math.max(len1, len2);
			if(len>end-start) {
				start = i-(len-1)/2;
				end = i+len/2;
			}
		}
		return end-start+1;
	}
	private static int expandAroundCenter(String s , int left , int right) {
		while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)) {
			left--;right++;
		}
		return right-left-1;          //因为第一次循环时用起始的left计算了一次,故而最终结果比实际长度多1
	}
}

只有三十行其实如果思路没有卡住这真的非常简单啊


算法思路细节

LPL方法中如何得出start和end的计算方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值