Bootstrap

字符串--P1308 统计单词数

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章

中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。

输入输出格式
输入格式:

共2行。

第1行为一个字符串,其中只含字母,表示给定单词;

第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式:

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数−1。
在这里插入图片描述

AC代码:
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int counter = 0, startIndex = -1;
    string goal;
    string origial;
    string temp;
    //可以接收带空格的string,没别的函数可以接收带空格的string
    getline(cin, goal);
    getline(cin, origial);
    transform(goal.begin(), goal.end(), goal.begin(), ::tolower);
    transform(origial.begin(), origial.end(), origial.begin(), ::tolower);
    string::iterator it = origial.begin();
    while (it != origial.end()) {
        //以空格分隔取单词
        temp = origial.substr(it - origial.begin(), find(it, origial.end(), ' ') - it);
        if (goal.compare(temp) == 0) {
            ++counter;
            if (counter == 1)
                startIndex = (int) (it - origial.begin());
        }
        it += max(temp.size(), (size_t) 1);
    }
    if (startIndex >= 0)
        cout << counter << ' ';
    cout << startIndex;
    return 0;
}
学到的点

1 getline(cin, goal);可以接收带空格的string,没别的函数可以接收带空格的string
2 transform()大小写转换函数
3 substr()字符串截取函数,返回子串
4 find()查找字符函数,返回迭代器,若无,返回end()
5 max()求最大值,要求输入参数相同类型
6 compare()比较是否相等,相等返回0

;