笔试精选1 计算回文字符串长度
题目描述
回文子串是指字符串的一个子串,这个子串从左往右和从右往左均一样,例如ABBA
和ABCBA
。
对于一个由大写英文字母和*
号组成的字符串,求它的最长回文子串的长度,其中一个*
号可以用来替代任意一个字符。
举例说明
字符串AB*B*AC
的最长回文子串的长度为6,当第1个*
号为 B
,第2个*
号也为B
时,可以得到一个回文子串ABBBBA
。
要求
输入一个包含大写英文字母和至少一个*
号的字符串,请输出最长回文子串的长度。
输入描述
单组输入
输入1行,包含一个由若干大写英文字母和至少一个"*"号组成的字符串,其长度小于等于1000。
输出描述
输出一个正整数,表示可以得到的最长回文子串的长度。
样例输入
DAB*B*ACD
样例输出
6
C源码
#include<stdio.h>
#include<string.h>
int main(){
char *ch;
int ll;
scanf("%s",ch); //接受输入的字符串ch
int len=strlen(ch); //得到字符串长度len
for(int i=0;i<len-1;i++){ //从第一个字符开始找
for(int j=len-1;j>i;j--){ //从后往前找,才能得到最长回文字符串
int m=i; //用m代替i
int n=j; //用n代替j
ll=0; //ll即为最长回文字符串长度
while(ch[m]==ch[n] || ch[n]=='*'){ //判断第i个字符和第j个字符是否相等或第j个字符是否为‘*’
m=m+1; //符合while条件后,取靠向内的字符
n=n-1; //符合while条件后,取靠向内的字符
ll++; //符合while条件后,回文字符串长度加1
if(m!=n)ll++; //判断第m和n个字符是否为同一个,若是,则长度不需加1;若不是,则再加1
if(m>n)break; //若m大于n,则说明已找到回文字符串
}
if(m<n)ll=0; //若到这步时m<n,则说明前面的while在没遍历完就FALSE了
if(ll!=0)break; //若长度ll=0,则说明未找到回文字符串,需进入循环接着找
}
if(ll!=0)break; //若长度ll=0,则说明未找到回文字符串,需进入循环接着找
}
if(ll!=0){
printf("%d",ll); //输出长度ll
}
else{
printf("There has none!");
}
return 0; //结束
}