A1077 给定N个字符串,求它们的公共后缀,如果不存在公共后缀,则输出“nai“

本文介绍如何使用C语言实现二维字符数组的反转,并通过一个实例展示如何利用这一技术来找出多个字符串间的共同后缀。代码示例详细解释了每一步操作,包括输入多个字符串、反转每个字符串以及比较它们的共同后缀。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二维字符数组的反转怎么实现?
//答:不一定要用另外一个字符数组来保存,直接拿一个临时变量来实现二维字符数组本身的变化即可,还有因为是
//二维字符数组,所以需要用到双循环;
//void reverseString(char str[i][],char ans[i][99])
//{
//    int longString=strlen(str[i]);
//    for(int j=0;j<longString;++j)
//    {
//        ans[][j]=str[i][longString-1-j];
//    }
//}
/*
    A1077 给定N个字符串,求它们的公共后缀,如果不存在公共后缀,则输出“nai“
*/
int main()
{
    int num=0;
    scanf("%d",&num);
    getchar();//防止换行符被下个的gets函数读入,形成错误
    char str[100][256]={{0}};//注意题目规定字符大小,否则会产生段错误
    char temp;//字符变量可以直接保存字符串???答:不是用来保存字符串,而是用来保存字符,因为是一个一个字符进行逆置
    int minStr=256;//记录最短字符串长度,注意因为是要求最小值,所以一开始赋值要赋值最大值,否则minStr永远是0
    for(int i=0;i<num;++i){//二维字符数组这里第一个下标也应该从零开始
        //scanf("%s",str[i]);//这里用gets比较好,因为字符串有可能有空格
        gets(str[i]);
        int longStr=strlen(str[i]);
        if(longStr<minStr)minStr=longStr;
        for(int j=0;j<longStr/2;++j){//循环条件要除以2,否则循环到后半部分,又重新逆置回来,整体看没产生影响
            temp=str[i][j];
            str[i][j]=str[i][longStr-1-j];
            str[i][longStr-1-j]=temp;
        }
    }
    int minSame=0;
    for(int k=0;k<minStr;++k){
        int flag=false;
        for(int m=1;m<num;++m){//这里m应该从1开始,因为k=0就是用来比较的
            if(str[m][k]==str[0][k]){
                flag=true;//这里要用flag而不直接minSame++的原因是要判断全部的字符串的同一位置的字符都相等才能minSame++;
                        //如果直接minSame++会导致如果两个以上的字符串同一位置相等,则minSame会多加,导致结果错误
            }
            else{
                flag=false;
                break;
            }
        }
        if(flag==true){
            minSame++;
        }
        else break;//这个不能省略,因为可能存在如果不是有相同后缀,有部分相同中缀,如果没有break;也会使minSame++;
    }
    if(minSame==0){
        printf("nai");//不存在公共后缀;
        return 0;
    }
    for(int n=minSame-1;n>=0;--n){//这里应该逆序打印,因为求的是后缀,现在字符数组已经被逆转了
        printf("%c",str[0][n]);
    }
//    测试是否逆置有效
//    for(int k=0;k<num;++k){
//        printf("%s\n",str[k]);
//    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值