更多PAT甲级题解--acking-you.github.io

题目


OJ平台

题目大意

题目大意很简单,就是给出很多句话,要你分析,最长的公共后缀。

  • 这个地方难在输入的处理,注意输入如果用的 getline() 接收的一行,则前面一般不能有别的输入方式,否则会起冲突,导致 getline() 并未抢到值。那么怎么解决呢?用 scanf("%d\n") 限定输入的分隔符,这样就不会有冲突了!

代码解析

Input输入处理

void Input() {
    scanf("%d\n", &N);
    for (int i = 0; i < N; i++) {
        getline(cin, s[i]);
        //顺便求出最大的长度方便后续遍历,
       //实际上求出最小长度是最好,这样就不用再后续判断了。
        MaxSize = max(MaxSize, (int)s[i].size());
    }
}

print输出处理

void print() {
    string res = "";//普通的迭代循环判断
    for (int i = 1; i <= MaxSize; i++) {
        if (s[0].size() < i)
            break;
        bool f = true;
        string cmp = s[0].substr(s[0].size() - i, i);
        for (int j = 0; j < N; j++) {
            int len = s[j].size();
            if (len < i)
                goto end;
            if (cmp != s[j].substr(len - i, i)) {
                f = false;
                break;
            }
        }
        if (f)
            res = cmp;
    }
end:
    res = (res == "") ? "nai" : res;
    cout << res;
}

整合代码得出答案

效率还挺好

#include<bits/stdc++.h>
using namespace std;
int N;
int MaxSize;
string s[101];
//@输入处理
void Input() {
    scanf("%d\n", &N);
    for (int i = 0; i < N; i++) {
        getline(cin, s[i]);
        MaxSize = max(MaxSize, (int)s[i].size());
    }
}
//@输出处理
void print() {
    string res = "";
    for (int i = 1; i <= MaxSize; i++) {
        if (s[0].size() < i)
            break;
        bool f = true;
        string cmp = s[0].substr(s[0].size() - i, i);
        for (int j = 0; j < N; j++) {
            int len = s[j].size();
            if (len < i)
                goto end;
            if (cmp != s[j].substr(len - i, i)) {
                f = false;
                break;
            }
        }
        if (f)
            res = cmp;
    }
end:
    res = (res == "") ? "nai" : res;
    cout << res;
}
int main() {
    Input();
    print();
    return 0;
}