西北工业大学ACM基地2022年大培训试题题解:第四周A题

描述

给定一个字符串S

对于每个询问,给出一个字符串T,问T是不是S的子串

(子串:连续的若干个元素)

输入

第一行输入一个字符串S

第二行输入一个正整数N,代表询问的个数

接下来的N行每行一个字符串T

1<=|S|<=500

1<=|T|<=|S|

1<=N<=100

S,T均由小写字母组成

输出

输出为N行

若T是S的子串,输出YES

输入样例

nwpunpuppu
3
npu
nn
pp

输出样例

YES
NO
YES

题解

思路

本题可用遍历方法。对每一个字符串,从总串开头开始遍历对应,检验是否是子串。

由于字符串长度不明,适用动态数组读取字符串。

源代码

// UOJ W4-A
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    string sMain, sVice;
    int n = 0;
    bool flagS = 0;
    vector<char> sVMain, sVVice;
    cin >> sMain;
    for (auto i : sMain) //读取总字符串
    {
        sVMain.push_back(i);
    }
    cin >> n; //读取数字
    // cout << "Len of sVec:" << sVMain.size() << endl;
    while (cin >> sVice)
    {
        sVVice.clear(); //清空子动态数组
        // cout << sVice;
        for (auto i : sVice) //读取字符串
        {
            sVVice.push_back(i);
        }
        int nMain = (int)sVMain.size(); //动态数组维度是无符号整型,小心越界!
        int nVice = (int)sVVice.size();
        for (int i = 0; i <= nMain - nVice + 1 - 1; i++) //从sVMain
        {
            flagS = 1; //字符相同性标识
            for (int j = 0; j <= nVice - 1; j++)
            {
                if (sVVice[j] != sVMain[i + j]) //判断单个字符
                    flagS = 0;                  //不相同
            }
            if (flagS == 1) //存在子串就跳出
                break;
        }
        if (flagS == 1) //全部字符相同
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

=EOF=

Last modification:November 21, 2022
如果觉得我的文章对你有用,请随意赞赏~