AcWing 779. 最长公共字符串后缀

题目传送门

一、知识点总结

1、 如何控制不断的输入,最终以输入\(0\)为结束标识?

while(cin>>n && n){

}

2、 如何反转一个字符串?

reverse(s[i].begin(),s[i].end());

3、 如何在两层循环中退出外层循环?
使用一个\(bool\)型变量,标识为\(true\)时,外层判断此变量是不是\(true\)来决定是否\(break\)

4、 如何截取字符串?

s.substr((int)s.size()-len)  //截取最后面len个
s.substr(0,len)              //截取前面len个	

二、实现代码

#include<bits/stdc++.h>

using namespace std;

const int N = 210;
string s[N];

//n是每个输入的字符串的个数
int n;

//len是用来控制有多少个字符是相同的
int len;

int main() {
    //优化输入
    ios::sync_with_stdio(false);

    while (cin >> n && n) {
        //记录最大长度
        int sz = 0;
        //接收字符串数组,并且反转
        for (int i = 0; i < n; i++) {
            cin >> s[i];
            reverse(s[i].begin(), s[i].end());
            sz = max(sz, (int) s[i].size());
        }

        //标识
        bool flag = false;
        //遍历每一个可能的长度,没有终止边界,内部肯定存在break
        for (len = 0; len < sz; len++) {
            //遍历每一个字符串
            for (int i = 0; i < n; i++) {
                //以每一个字符串的这一位与每一个字符串的这一位进行对比
                if (s[0][len] != s[i][len]) {
                    flag = true;
                    break;
                }
            }
            if (flag) break;
        }
        //字符串的相同后缀长度
        if (len > 0) {
            //还是拿第一个字符串为操作样例,把它反转回来
            reverse(s[0].begin(), s[0].end());
            //利用substr截取它的后面数len位
            cout << s[0].substr((int) s[0].size() - len) << endl;
        } else cout << "" << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/littlehb/p/15457615.html