洛谷P1308 统计单词数 题解 模拟

题目链接:https://www.luogu.com.cn/problem/P1308

解题思路:
这道题目因为需要记录第一个单词出现的位置,所以需要整行读入。
我们假设给定单词是 s,给定文章是 t。那么在C++当中,使用char数组可以按照如下方式输入:

char s[maxn], t[maxn];
gets(s);
gets(t);

使用string可以按照如下方式输入:

string s, t;
getline(cin, s);
getline(cin, t);

因为这里不区分大小写,所以我们在一开始可以考虑将所有字母都转成小写(C++中可以使用 tolower() 函数)。

然后,我们假设假设 \(s\) 的长度为 \(n\)\(t\) 的长度为 \(m\)

则我们枚举文章 t 的每一个位置,则只要满足如下两个条件:

  • \(t[i]\) 开始的长度为 \(n\) 的子串和 \(s\) 相同;
  • 这个子串是一个单独的子串,即:
    1. i==0 或者 t[i-1] == ' ';同时
    2. i+n==m 或者 t[i+m] == ' '

则我们知道了一个满足条件的子串。

比较字符串,可以在内层再开一个for循环,也可以使用 strncmp(char数组) 或者 t.substr(i,n)==s(string) 来判断。

示例代码如下:

#include <bits/stdc++.h>
using namespace std;
string s, t;
int n, m, num, id = -1;
int main() {
    getline(cin, s);
    getline(cin, t);
    n = s.length();
    m = t.length();
    for (int i = 0; i < n; i ++) s[i] = tolower(s[i]);
    for (int i = 0; i < m; i ++) t[i] = tolower(t[i]);
    for (int i = 0; i+n-1 < m; i ++) {
        if (t.substr(i, n) == s && (i==0 || t[i-1]==' ') && (i+n==m || t[i+n]==' ')) {
            num ++;
            if (id == -1) id = i;
        }
    }
    if (id != -1) cout << num << " " << id << endl;
    else puts("-1");
    return 0;
}
posted @ 2020-04-14 14:20  quanjun  阅读(203)  评论(0编辑  收藏  举报