PAT-A 1077. Kuchiguse (20)

题目链接在此

题意

给定N个字符串,求相同后缀并输出;若果没有后缀,则输出“nai”。

思路

为了方便,现将输入的字符串反转,这样问题就转变成求字符串的相同前缀了。
我们用min_len记录所有字符串的最小长度,之后枚举所有字符串在[0,min_len)内的字符,判断相同位置的字符是否相同,如果相同,则写入suffix[]字符数组(用整型变量num来控制suffix下标,即保存的字符个数),如果不同,则停止枚举即可。
最后判断num,num等于0则输出nai,否则倒序输出所有字符即可。

当然,也可以不需要把相同的字符放入suffix数组,只需要有一个变量在枚举的过程中记住前缀字符串的最大下标即可,这样之后也可以输出。

有些需要注意的地方在代码注释中已经标注。

AC代码

#include<stdio.h>
#include<string.h>

//倒转字符串 
void Reverse(char str[], int len){
    for(int i = 0; i < len/2; i++){
        int temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
    }
}

int main(){

    int N;
    scanf("%d",&N);
    getchar(); //吸收换行 

    char speak[101][257];

    int min_len=257, len; //min_len保存N个字符串的最小长度 
    for(int i = 0; i < N; i++){
        gets(speak[i]);

        len = strlen(speak[i]);
        Reverse(speak[i], len); 

        //更新min_len
        if(len < min_len){
            min_len = len;
        } 
    } 

    //让每一个字符串的相同位的字符相比较 
    char suffix[257];
    int num = 0, j;
    for(int i = 0 ; i < min_len; i++){
        for(j = 1; j < N; j++){
            if(speak[j][i] != speak[j-1][i]) break; //不同,退出j循环 
        }
        if(j == N){ //j循环正常退出,则speak[][i]位相同,写进suffix
            suffix[num++] = speak[0][i]; //不能写成speak[j][i],此时j已经越界,第一维写成0~N-1都可以,因为相同 
        } else{ //j循环时break出来的,则i循环也break即可,因为不相同了 
            break;
        }
    }

    //输出结果
    if(num==0){ //没有suffix 
        printf("nai\n");
    } else{ //有suffix ,倒序输出suffix数组 
        for(int i = num-1; i >= 0; i--){
            printf("%c",suffix[i]);
        } 
    } 

    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值