sdnu 1099 前缀判断

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]);}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值