C++字符串和字符串流應用【noip2011普及組第2題】

P1308 統計單詞數

題目描述

一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。

現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章

中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。

輸入輸出格式

輸入格式:
共2行。

第1行爲一個字符串,其中只含字母,表示給定單詞;

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

輸出格式:

一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從00 開始);如果單詞在文章中沒有出現,則直接輸出一個整數-1−1。

輸入輸出樣例

輸入樣例#1: 複製
To
to be or not to be is a question
輸出樣例#1: 複製
2 0

輸入樣例#2: 複製
to
Did the Ottoman Empire lose its power at that time
輸出樣例#2: 複製
-1

說明

數據範圍
1≤ 1≤單詞長度≤10≤10。
1≤ 1≤文章長度≤1,000,000≤1,000,000。

題解 C++字符串和字符串流

AC代碼

#include <bits/stdc++.h>

using namespace std;

int main() {
    string key, text;
    cin >> key;
    cin.get(); //cin讀取後如果用getline需用cin.get()跳過當前回車!!
    getline(cin, text);//讀取文本
    transform(key.begin(), key.end(), key.begin(), ::tolower);//key變成小寫
    transform(text.begin(), text.end(), text.begin(), ::tolower);//text變成小寫

    istringstream iss(text);//構造字符串輸入流來匹配
    int tot = 0;
    for (string w; iss >> w;) {
        if (w == key)
            ++tot;
    }
    if (tot == 0) {//沒有找到匹配
        cout << -1 << endl;
    } else {
        //直接調用find 會出錯,因爲key=to 則 tom motto都會匹配,
        //所以一個很有用的小技巧是在key兩側加上空格,text兩側也要加上,剛好座標還不變
        key = " " + key + " ";
        text = " " + text + " ";
        cout << tot << " " << text.find(key) << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章