Description
给定 n 个字符串,求有多少字符串是其他字符串的前缀。
Input
第一行为一个整数n(1 <= n <= 1000),之后n行,每行一个字符串,字符串只由26个小写字母组成,最大长度为100。
Output
一个整数,有多少字符串是其他字符串的前缀。
Sample Input
5 abcde ab bcde b cde
Sample Output
2
此题可用set容器处理
代码如下:
#include <iostream>
#include <cstdio>
#include <set>
#include <cstring>
using namespace std;
int main()
{
int n, i, j = 0;
unsigned int t = 1;
string strs[1005], x;
set <string> s;//每一个被分开的字符串
set <string> c;//所有重复的字符串
scanf("%d", &n);
for(i = 0; i < n; i++)
cin >> strs[i] ;
for(i = 0; i < n; i++){
for(int a = i + 1; a < n; a++){
if(strs[i] == strs[a])//判断输入的所有字符串是否有重复的
c.insert(strs[i]);break;}//将重复的放入容器中
}
for(i = 0; i < n; i++){
for(t = 1; t < strs[i].length(); t++){
x = strs[i].substr(0, t);
s.insert(x);//将分开的字符串放入容器中
}
}
for(i = 0; i < n; i++){
if(s.count(strs[i]) != 0)
j++;//利用循环判断分开的字符串的容器中与总的是否有重合的
else if(c.count(strs[i]) != 0)
j++;//判断是否有重复的字符串,此种情况可以互为前缀
}
printf("%d", j);
return 0;
}
有几个知识点需要掌握:
1.string类型只用一般cin输入;
2.
if(s.count(strs[i]) != 0)
此句是判断容器s中的元素能否在strs数组中找到,能找到就return 1,找不到就return0
3.substr(a,b)是将字符串从第a+1位到b+1位分开;
4.判断数组中是否有相同元素还有一种较为简单的方法(借用他人思路)
set <string> part;//截取每个字符串的部分放入里面
set <string> quan;//将每个字符串放入里面
set <string> chong;//重复的字符串放入里面
for(i=0; i<n; i++)
{
cin >> s[i];
if( quan.count(s[i])!=0 )//说明该容器里有这个字符串,返回值为1;否则为零;
chong.insert (s[i]);
quan.insert (s[i]);}