1. 程式人生 > 實用技巧 >杭電OJ 字串類題目解題思路

杭電OJ 字串類題目解題思路

一、前言

不知不覺已經大三上學期了,可作為一個計算機狗還沒有考過CCF-CSP。因平時學習內容主要與安全方面相關,對於此類演算法類的考核並沒有太多的準備,故打算開始刷題複習演算法和資料結構,準備衝擊2020年12月的CCF認證。雖然平時在學校裡使用java語言較多,但考慮到語言執行速度和編譯器的熟練程度,以及網路上對於OJ題目的解法大多為c/c++編寫,故此次打算報名c/c++作為編寫語言。因此筆者在解題過程中可能會較多使用STL,並對其功能進行一些講解。

筆者將按照題目的型別進行部落格的發表,僅供學習、交流和參考。

二、題解

2072、單詞數

此題的思路很簡單,我們接收一個字串,將其中的單詞逐個提取出來;然後構造一個結構儲存單詞字串,此結構初始時為空,每次將逐個取出的單詞與此結構中的所有單詞比較,如果此單詞已經儲存,繼續提取下一個單詞;如果還未儲存,那麼儲存此單詞在結構中,單詞計數器加一。

此題有以下幾個需要注意的地方:

1、輸入字串的接收。如果我們僅使用cin來輸入字串,那麼遇到空格時,一次輸入就會結束,無法接收完整的字串。故在此題中需要使用以下:

getline(cin,string s),可以輸入時接收空格在字串中,遇到回車符結束一次輸入。包含在<string>標頭檔案中。 2、儲存結構的選則。因為我們一開始不知道一句話會有多少個單詞,也不知道單詞數的上限,所以選擇可變長結構vector來儲存字串。因此,我們在最後計算單詞個數時,既可以使用自定義的計數器count,也可以直接使用函式vector.size()。 3、此題可能會出現在句子開頭、結尾出現空格以及兩個單詞中間出現多個空格的情況,要在程式中予以考慮。 筆者原始碼如下:
#include<iostream>
#include
<vector> #include<string.h> #include<string> using namespace std; int main(void){ string s; while(getline(cin,s)){ int count = 0; if(s=="#") break; vector<string>vec; //用於存放已經統計過的字串 int len = s.length(); int begin = 0; //本次擷取的頭部
for(int i=0;i<len;i++){ if(s[i]==' '||i==len-1){ string now; if(s[i]==' ') now = s.substr(begin,i-begin); else if(i==len-1) now = s.substr(begin,len-begin); int j; for(j=0;j<count;j++){ if(now==vec[j]) break; } if(j==count&&now!=""){ //防止開頭、結尾有空格同時中間有多個空格的情況 vec.push_back(now); //如果這個單詞還沒有被統計過,則放入容器中 count++; } begin = i + 1; //更新擷取起始位置 } } cout<<count<<endl; vec.clear(); } return 0; }