字符串匹配 D-爱书人的资料查询

892 阅读3分钟

题目描述

本居小铃从她的朋友稗田阿求那里听到了一个有趣的消息:外界一个叫做“辽宁省”的地方正在举办省赛。
小铃对这个名叫“辽宁省”的地方充满了好奇。
小铃想要进一步了解辽宁省,于是她找来了许多外界的资料。
为了判断哪些资料和辽宁省有关,她想出了一种判断资料相关度的方法。
首先,小铃先选出n个单词,认为资料的相关度只与这n个单词的出现次数有关。
然后,小铃在资料中寻找这些单词,并记录它们出现的次数,出现的次数越多,小铃就认为这些资料与东北大学越相关。
现在,小铃已经选出了这n个单词,正准备开始读资料,稗田阿求却来找她借书了。你能帮助小铃完成资料的阅读,并告诉小铃资料中小铃选定的单词出现了多少次吗?
PS:来源:2021辽宁省大学生程序设计竞赛(热身赛)
链接:ac.nowcoder.com/acm/contest…

输入描述:

数据的第一行含有一个整数T(1≤T≤101 \le T \le101≤T≤10), 表示数据的组数。
对于每一组数据:
第一行含有一个整数n(1≤n≤101\le n \le 101≤n≤10),代表小铃选出的单词总数。
接下来n行,每行一个长度为w(1≤w≤101\le w \le 101≤w≤10)的、仅由小写字母组成的字符串,代表小铃选出的n个单词。
接下来一个长度为s(1≤s≤1041 \le s \le 10^41≤s≤104)的、仅由小写字母组成的字符串,代表资料的内容。

输出描述:

每组测试数据输出一个数,表示小铃选出的那些单词在资料里总共出现了多少次。

示例1

输入

2
2
neu
neuoj
neuisestablishedin1923neuojis2013
1
aa
aaa

输出

3
2

思路分析

典型的字符串匹配问题,我有两种解法
其一,使用C++ STL的find函数,返回w[i]在s 中的下标位置,默认是首次出现位置
如果没找到,find函数会返回特定标志npos,这是一个很大的数,只要position不等于npos,用来记录的times就++
AC代码2是常规的复杂操作,点赞数超过3再分析,留坑

AC代码1

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T,n,t,times;
    string w[10],s;
    cin>>T;
    while(T--)
    {
        times=0;
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>w[i];
        cin>>s;
        for(int i=0;i<n;i++)
        {
            int position=s.find(w[i]);
            while(position!=s.npos)
            {
                times++;
                position=s.find(w[i],position+1);//从w[i]的第position+1个字符开始找S
            }
        }
        cout<<times<<endl;
    }
    return 0;
}

AC代码2

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T,n,t,flag,times;
    string w[10],s;
    cin>>T;
    while(T--)
    {
        times=0;
        cin>>n;
        for(int i=0;i<n;i++)
        	cin>>w[i];
        cin>>s;
        for(int j=0;j<s.length();j++)
        {
            for(int k=0;k<n;k++)
            {
                t=j;
                flag=0;
                for(int i=0;i<w[k].length();i++)
                {
                    if(s[t++]!=w[k][i])
                        flag=1;
                }
                if(flag==0)
                    times++;
            }
        }
       cout<<times<<endl;
    }
    return 0;
}

总结感悟

生命不息,码不停题!