一、知识点总结
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;
}