1040 Longest Symmetric String -PAT甲级

Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.

Input Specification:

Each input file contains one test case which gives a non-empty string of length no more than 1000.

Output Specification:

For each test case, simply print the maximum length in a line.

Sample Input:

Is PAT&TAP symmetric?

Sample Output:

11

第一种解法:

将字符压入前面与之相同的所有字符的vector数组中,数组的下标就是字符在输入的字符串的下标,然后检测以其中两个为首尾的字符串是否是回文字符即可,但是在提交上去显示出现了有些样例段错误,找不到原因,如果有类似想法的小伙伴,欢迎一起来交流

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
vector<int>ve[N];
map<char,int>mp;
bool check(string s){
	//判断是否是回文串的方法
	if(s.size()==1) return true;
	/*string t=s;
	reverse(t.begin(),t.end());
	if(s==t) return true;
	return false; */
	for(int i=0,j=s.size()-1;i<=j;i++,j--){
		if(s[i]!=s[j])
			return false;
	}
	return true;
}
int main(){
	string s;
	getline(cin,s);
	for(int i=0;i<s.size();i++){
		if(mp[s[i]]==0){
			mp[s[i]]=i+1;
			ve[i].push_back(i);	
		}else{
			for(auto j:ve[mp[s[i]]-1]){
			ve[j].push_back(i);
			}	
			ve[i].push_back(i);
		}		
	}
	int max_num=0;
	for(int i=0;i<s.size();i++){
		int tt=s.size()-i;
		if(tt<max_num) break;
		while(!ve[i].empty()){
			int j=ve[i].back();
			ve[i].pop_back();
			if((j-i+1)<max_num){
				break;
			}
			string ss=s.substr(i,j-i+1);
			//int jj=ss.size();
			if(check(ss)){
				max_num=j-i+1;
				break;
			}
		}
	}
	printf("%d\n",max_num);
	return 0;
}

 第二种解法:遍历当前字符串中的每个字符,然后以该字符向左向右进行拓展,查找最长的回文串,分为两种类型,(1)是ABCBA的类型,以当前的字符为中心,向左右拓展同样的字符,观察是否相等;(2)ABBA的类型,以当前字符为左侧的一个字符,来向右进行进行拓展,看是否相等

满分代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	getline(cin,s);
	int maxlen=0;
	for(int i=0;i<s.size();i++){
		int j;//j表示当前字符左侧的字符的个数
		//ABCBA的形式 
		for(j=1;i-j>=0&&i+j<s.size()&&s[i-j]==s[i+j];j++){
			maxlen=max(maxlen,2*j+1);
			//更新回文串的最大长度 
		}
		//ABBA的形式 
		for(j=0;i-j>=0&&i+j+1<s.size()&&s[i-j]==s[i+j+1];j++){
			maxlen=max(maxlen,2*(j+1));
		}
	}
	if(maxlen==0) maxlen=1;
	printf("%d",maxlen);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值