洛谷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\) 相同;
- 这个子串是一个单独的子串,即:
i==0
或者t[i-1] == ' '
;同时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;
}