xtu oj 1613 回文串

题目描述#
一个字符串,你可以在这个字符串后面拼接若干个任意字符,使得这个字符串成为回文串。

回文串,即字符串从左到右,从右到左读是一样的。

比如字符串abcbc,你可以在最后拼接2个字符ba,使得字符串变为回文串abcbcba,

现在给你一个只含英文小写字母的字符串,请问在后面拼接多少个字符会使得其变成回文串。

输入格式#
第一行是一个整数,表示样例的数量。每个样例为一个字符串,只含英文小写字母,长度不超过1000。

输出格式#
依次输出每个样例的结果,为一个整数。

样例输入#
3
a
ab
abc
样例输出#
0
1
2

解题思路:找最长回文子串,且回文子串的最后一位是字符串末尾字符

方法一:参考之前写的文章

leetcode 5 最长回文串

分回文子串是奇数和偶数讨论,注意考虑越界情况

(1)奇数 left=i-1,right=i+1

向两侧扩散 a[left]=a[right],left--,right++

len=right-left-1与len比大小,大于则更新len和start的值

(2)偶数,left=i.right=i+1

与奇数同理

注意点:  if(right!=len)continue;

不然会wa

#include<stdio.h>
#include<string.h>
//判断是否是回文串
int Judge(char s[],int len){
    int flag=1,i;
    for(i=0;i<=len/2;i++){
        if(s[i]!=s[len-i-1]){
            flag=0;
            break;
        }
    }
    return flag;
} 
int main(){
    int T;
    scanf("%d",&T);
    char s[1005]={};
    while(T--){
        scanf("%s",s);
        int len=strlen(s);
        int cnt=0,i,j;
        if(Judge(s,len))cnt=0;
        else{
            int start=0,left,right,max=0;
            //回文子串为奇数 
            for(i=0;i<len;i++){
                left=i-1,right=i+1;
                while(left>=0&&right<len&&s[left]==s[right]){
                	//向两侧扩散 
                    left--;
                    right++;
                }
                if(right!=len)continue;
                if(right-left-1>=max){
                    max=right-left-1;
                    start=left+1;
                }
            }
             //回文子串为偶数 
            for(i=0;i<len;i++){
                left=i,right=i+1;
                while(left>=0&&right<len&&s[left]==s[right]){
                    left--;
                    right++;
                }
                if(right!=len)continue;
                if(right-left-1>=max){
                    max=right-left-1;
                    start=left+1;
                }
            }
            if(start+max==len)cnt=start;
            else cnt=len-1;
        }
        printf("%d\n",cnt);
    }
}

方法二:这个方法更简单

Judge(s+i,len-i) 一开始没想到这个方法

#include<stdio.h>
#include<string.h>
//判断是否是回文串
int Judge(char s[],int len){
	int flag=1,i;
	for(i=0;i<=len/2;i++){
		if(s[i]!=s[len-i-1]){
			flag=0;
			break;
		}
	}
	return flag;
} 
int Add(char s[]){
	int len=strlen(s);
	int i;
	for(i=0;i<len;i++){
		if(Judge(s+i,len-i))return i;
	}
	return len-1;//最差情况 
}
int main(){
	int T;
	scanf("%d",&T);
	char s[1005]={};
	while(T--){
		scanf("%s",s);
		printf("%d\n",Add(s));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值