1.3.3 最长的回文(Calf Flac) Java实现

该博客讨论了如何在无限数量的母牛制造的文本中寻找最长的回文,忽略标点和空格,仅考虑字母。最长回文长度不超过2,000个字符。文章提供了一个不超过20,000字符的输入文件,输出包含最长回文的长度及其原文,优先显示最先出现的最长回文。" 82227075,7957704,Spring集成RabbitMQ配置详解 - Topic模式,"['消息队列', 'RabbitMQ', 'Spring整合', 'topic模式', '配置教程']
摘要由CSDN通过智能技术生成

据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最 棒的回文. 你的工作就是去这些牛制造的奇观中寻找最长的回文. 寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母 ‘A’-‘Z’和’a’-‘z’. 要你寻找的最长的回文的文章是一个不超过 20,000 个字符的字符串. 我们将保证最长的回文不会超过 2,000 个字符(在除去标点符号、空格之前).

输入格式:

一个不超过 20,000 个字符的文件.

输出格式:

输出的第一行应该包括找到的最长的回文的长度. 下一个行或几行应该包括这个回文的原文(没有除去标点符号、空格), 把这个回文输出到一行或多行(如果回文中包括换行符). 如果有多个回文长度都等于最大值,输出那个前出现的.

输入样例:

在这里给出一组输入。例如:

Confucius say: Madam, I’m Adam.

输出样例:

在这里给出相应的输出。例如:

11
Madam, I’m Adam

代码如下:

import java.util.Scanner;
public class Main {
	static char s[]=new char[40005],t[]=new char[40005];
	static int a[]= new int[40005];
	static int cnt=0;
	static int cntt=0;
	public static int huiwen(int x){//从下标x向两侧延伸 
		int ans1=1,ans2=0;
		for(int j=1;j<=x&&j+x<cnt&&t[x-j]==t[x+j];j++) ans1+=2;//奇数延拓 
		for(int i=x,j=x+1;i>=0&&j<cnt&&t[i]==t[j];i--,j++) ans2+=2;//偶数延拓 
		return Math.max(ans1,ans2);
	}
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		int maxm=0,maxx=0;
        
		String str=new String();
		while(in.hasNext()) {
			str=str+in.nextLine()+'\n';//因为有的字符串不满一行就可能换行,所以我们每次加‘\n’   自己测试代码的时候按Ctrl+z结束输入
		}
		str=str.substring(0,str.length()-1);//去掉最后的一个换行
		s=str.toCharArray();
		cntt=str.length();
        
		for(int i=0;i<cntt;i++){
			if(s[i]>='A'&&s[i]<='Z'){
				a[cnt]=i;
				t[cnt++]= (char) (s[i]-'A'+'a');
			}
			else if(s[i]>='a'&&s[i]<='z'){
				a[cnt]=i;
				t[cnt++]=s[i];
			}
		}
		t[cnt]='\0';
		for(int i=0;i<cnt;i++){
			int lenoi=huiwen(i);
			if(lenoi>maxm){
				maxm=lenoi;
				maxx=i;
			}
		}
		System.out.println(maxm);
		if(maxm%2>0){
			int begin=maxx-maxm/2;
			int end=maxx+maxm/2;
			for(int i=a[begin];i<=a[end];i++){
				System.out.print(s[i]);
			}
		}
		else{
			int begin=maxx-maxm/2+1;
			int end=maxx+maxm/2;
			for(int i=a[begin];i<=a[end];i++){
				System.out.print(s[i]);
			}
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值