ZeroJudge A308: 統計單詞數

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

現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章中的某一獨立單詞在不區分大小寫的情況下完全相同 (參見樣例 1),如果給定單詞僅是文章中某一單詞的一部分則不算匹配 (參見樣例 2)。

範例測資

範例輸入範例輸出
輸入2 行。
第 1 行為一個字符串,其中只含字母,表示給定單詞;第 2 行為一個字符串,其中只可能包含字母和空格,表示給定的文章。
只有一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置 (即在文章中第一次出現時,單詞首字母在文章中的位置,位置從 0 開始);如果單詞在文章中沒有出現,則直接輸出一個整數 -1。
To
to be or not to be is a question
to
Did the Ottoman Empire lose its power at that time
2 0
-1

解題思路

因為大小寫視為相同,所以收資料時都要先將所有字串統一小寫或大寫。

使用 For迴圈 來切字串,這邊不能用 stringstream 是因為這樣會忽略連續的空格。

當得到一個字串時,判斷其是否是要找的字串,如果是的話就要判斷是否為第一次出現,可以宣告一個布林值來紀錄,並且要將答案 +1。

範例程式碼-ZeroJudge A308: 統計單詞數

#include <iostream>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    string target;
    while (getline(cin, target)) {
        for (int i = 0; i<target.length(); i++) target[i] = tolower(target[i]);
        string str, tmp = "";
        getline(cin, str);
        bool first = true;
        int begin = 0, count = 0;
        for (int i = 0; i<str.length(); i++) {
            if (str[i] == ' ' && !tmp.empty()) {
                if (tmp == target) {
                    if (first) {
                        first = false;
                        begin = i-target.length();
                    }
                    count++;
                }
                tmp = "";
                continue;
            }
            if (str[i] != ' ') tmp += tolower(str[i]);
        }
        if (count == 0) cout << "-1\n";
        else cout << count << " " << begin << "\n";
    }
}

//ZeroJudge A308
//Dr. SeanXD

發佈留言