A24184. 统计单词数
填空题
中等
知识点
题目描述
统计单词数
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
输入
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数-1。
输入样例
To
to be or not to be is a question输出样例
2 0参考答案
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
char s[N];//整篇文章
void lower(char s[], int len)//将长为len的字符数组中大写字母转为小写字母
{
for(int i = 0; i < len; ++i)
if(s[i] >= 'A' && s[i] <= 'Z')
s[i] = s[i] - 'A' + 'a';
}
int main()
{
char word[100];//word:要查找的单词
int k = 0, firstPos = -1, ct = 0;//k为word的下标,若当前遍历的单词已经与word不同,那么将k设为-1
cin >> word;
cin.get();//吸收一个换行符
cin.getline(s, N);
int len = strlen(s), lenw = strlen(word);
lower(word, lenw);//把输入的单词及句子都转为小写
lower(s, len);
for(int i = 0; i <= len; ++i)//遍历到'\0'
{
if(s[i] == ' ' || s[i] == '\0')//如果完成读取一个单词
{
if(k == lenw)//如果在s中遍历的长度与单词word的长度相同,即找到一个和word相同的单词
{
ct++;//技术
if(firstPos == -1)//记录第一次出现的位置
firstPos = i - lenw;//当前位置i是单词后的空格的位置,减去lenw后即为单词第一个字符的位置
}
k = 0;//k还原为0,准备看下一个单词是否与word相同
}
else
{
if(k >= 0)//如果k>=0,说明s中有部分与word相同。如果k为-1,说明这个单词与word不同。
{
if(word[k] == s[i])
k++;
else
k = -1;
}
}
}
if(firstPos == -1)//如果不存在要查找的单词
cout << -1;
else//如果存在
cout << ct << ' ' << firstPos;
return 0;
}答案解析
#include<bits/stdc++.h>
using namespace std;
string lower(string s)
{
for(int i = 0; i < s.length(); ++i)
s[i] = tolower(s[i]);
return s;
}
int main()
{
string s, w;
getline(cin, w);
getline(cin, s);
s = ' '+lower(s)+' ';
w = ' '+lower(w)+' ';
int fp = -1, p = s.find(w), cnt = 0;
while(p != -1)
{
if(fp == -1)
fp = p;
cnt++;
p = s.find(w, p+1);
}
if(fp == -1)
cout << -1;
else
cout << cnt << ' ' << fp;
return 0;
}
上一题
下一题