美文网首页
A1077 Kuchiguse (20分)(答案)

A1077 Kuchiguse (20分)(答案)

作者: km15 | 来源:发表于2020-01-21 17:22 被阅读0次

    考察,找几个字符串的最小公共子串

    learn && wrong;
    1、果然找最小,还是得循环
    2、如何比较几个子串的公共最小子串是个问题!

    取第一个字符串的第一个字符出来,然后枚举所有的字符串(for),比较是否一样,一样则第一个字符串的下一个,不一样则break
    以一个flag标记,如果flag没改变,就int ans ++(还有个else_break双重break),最后判断ans的值是多少,然后输出!

    3、reversize()是算法库而不是string的函数?string没有这个函数,而是<algorithnm>,或者<cstring>中的,strrev()函数
    4、我少了这个,特别注意,重大问题:输入一个数字,接下来连续好几场的串,必须用getchar()吸收空格!
    5、循环老是写错,i,j不分
    6、scanf+%s和gets是不同的,前者以空格为截断,后者以换行符为截断

    /*
    编程思想:
    1、输入个数,并且用字符数组把它们存起来?
    2、将它们反转
    3、找出最小长度的那个,然后枚举相同的个数,最后输出即可,如果长度为0.则数nai

    反转,
    然后按行输入string
    枚举[][]
    */

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    
    string str[110];
    int main()
    {
        int num;
        cin >> num;
        getchar();
        //!!!我少了这个,特别注意,重大问题
        for (int i = 0; i < num;i++) {  //逐行输入
            getline(cin, str[i],'\n');
        }
    
        for (int i = 0;i < num;i++) {  //逐个反转
            reverse(str[i].begin(), str[i].end());
        }
    
        int min_num = 257; //怎么找出最小长度那个,肯定有办法,循环吗,
        for (int i = 0;i < num;i++) {
            if (str[i].size() < min_num) {
                min_num = str[i].size();
            }
        }
    
    
        //如何找到共同的子串,是三个一起比较吗,还是两个两个比较?我懵了,第二个样例,是要三个一起比较的
        //主要是我不知道num是多少呀,只能是数字呀,这个不定,肯定是数组,那怎么一起比较呢,两个两个来?
        
        /*!!!我知道了,太强了,取第一个字符串的第一个字符出来,然后枚举所有的字符串,比较是否一样,一样则第一个字符串的下一个,不一样则break
        以一个flag标记,如果flag没改变,就int ans ++;最后判断ans的值是多少,然后输出!
    
        */
        int ans = 0;
        for (int i = 0;i < min_num;++i) {  //枚举最小串
            char c = str[0][i];
            bool flag = true;
            for (int j = 1; j < num;j++) {  //几个字符逐一比较
                if (c != str[j][i])  //如果不同則break,如果相同則ans++,最後輸出即可   //!!!这里错在了!错在了那个,里面有个内层循环,ans第一个字符了,而是N个数组N个ans了,所以还是得标准答案!以一个flag记录全部子串的第一个,然后以flag判断是不是要加
                {                       //j 写成了i!!!
                    flag = false;
                    break;
                }
           
            }
            if (flag) ++ans;
            else break; //!!!记得这里还有个else  break;
            
        }
    
        if (ans == 0) cout << "nai" << endl;
        else {
            for (int i = ans - 1; i >= 0;--i) {  //i >= 0,写成了ans>=0,越界了
                cout << str[0][i];
            }
        }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:A1077 Kuchiguse (20分)(答案)

          本文链接:https://www.haomeiwen.com/subject/haekzctx.html