2020年9月8日 星期二

a308: NOIP2011 2.统计单词数

解題心得:
用string的find()快速找到子字串的開頭位置,如果沒有則回傳string::npos。
不過這樣找也有可能會找到錯誤的,像是找單字:to
如果有一個單字叫otto或tto之類有包含to兩字母的話,也會誤以為找到。
因此則改成找單字且前後都有空格的話才算是找到,也因此句子裡每一個單字前後也都要有空白,所以才有那兩行奇怪的操作。

程式碼:
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    int count=0;
    string s,word,tmp;
    getline(cin,word);
    getline(cin,s);
    for(int i=0;i<word.size();i++)
        word[i]=tolower(word[i]);
    for(int i=0;i<s.size();i++){
        s[i]=tolower(s[i]);
    }
    stringstream ss(s);
    while(ss>>tmp)
    {
        if(tmp==word)
            count++;
    }
    word=' '+word+' ';
    s=' '+s+' ';
    if(s.find(word)!=string::npos) cout<<count<<" "<<s.find(word)<<endl;
    else cout<<-1<<endl;
    return 0;
}

沒有留言:

張貼留言