1. 题目
2. 分析
题意:引用日本的语言例子,带出需要我们找出每个句子的末尾公共后缀需求,如果没有公共后缀则输出“nai”。
3. 解题过程
- 第一种思路是直接法:用string数组储存每一行的字符串,然后以第一个字符串为模板,对后面的字符串从后往前跟模板比较,只要不同就退出循环,若相同则记录下该字符,最后再反过来输出结果即可。
- 第二种思路是反转法:考虑到是找后面的公共后缀比较麻烦,就在一开始就将接受到的字符串反转,然后同样以第一个为模板,每次取两个字符串的公共部分(name.substr(pos, len)),最后同样再反转一次输出即可。
- 请看代码
第一种思路:
#include<string>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n; scanf("%d\n", &n);
string A[n];
for(int i = 0; i < n; i++)
{
getline(cin, A[i]);
}
int cnt = 0, flag = 0;
char ans[260];
while(1)
{
char temp = A[0][A[0].length()-cnt-1];
int same = 0;
for(int i = 1; i < n; i++)
{
int num = A[i].length();
if(A[i][num-cnt-1] != temp)
{
flag = 1;
same = 1;
break;
}
}
if(flag == 1) break;
if(same == 0) ans[cnt] = temp;
cnt++;
if(cnt == A[0].length()) break;
}
if(strlen(ans) == 0) printf("nai");
else
{
for(int i = strlen(ans)-1; i >= 0; i--)
{
printf("%c", ans[i]);
}
}
return 0;
}
第二种思路:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n; scanf("%d\n", &n);
string ans;
for(int i = 0; i < n; i++)
{
string s;
getline(cin, s);
int lens = s.length();
reverse(s.begin(), s.end());
if(i == 0)
{
ans = s;
continue;
}
else
{
int lenans = ans.length();
int minlen = min(lens, lenans);
for(int j = 0; j < minlen; j++)
{
if(ans[j] != s[j])
{
ans = ans.substr(0, j);
break;
}
}
}
}
reverse(ans.begin(), ans.end());
if(ans.length() == 0) ans = "nai";
cout << ans;
return 0;
}
4. 小结
- 第一种思路简单,实现起来需要一定的代码能力。
- 第二种想法巧妙,能省下不少力气。
感谢阅读,欢迎点赞支持