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;
}