| 試題編號: | 201409-3 |
| 試題名稱: | 字符串匹配 |
| 時間限制: | 1.0s |
| 內存限制: | 256.0MB |
| 問題描述: | 問題描述 給出一個字符串和多行文字,在這些文字中找到字符串出現的那些行。你的程序還需支持大小寫敏感選項:當選項打開時,表示同一個字母的大寫和小寫看作不同的字符;當選項關閉時,表示同一個字母的大寫和小寫看作相同的字符。輸入格式 輸入的第一行包含一個字符串S,由大小寫英文字母組成。 第二行包含一個數字,表示大小寫敏感的選項,當數字為0時表示大小寫不敏感,當數字為1時表示大小寫敏感。 第三行包含一個整數n,表示給出的文字的行數?! 〗酉聛韓行,每行包含一個字符串,字符串由大小寫英文字母組成,不含空格和其他字符。輸出格式 輸出多行,每行包含一個字符串,按出現的順序依次給出那些包含了字符串S的行。樣例輸入Hello15HelloWorldHiHiHelloHiHiGrepIsAGreatToolHELLOHELLOisNOTHello樣例輸出HelloWorldHiHiHelloHiHiHELLOisNOTHello樣例說明 在上面的樣例中,第四個字符串雖然也是Hello,但是大小寫不正確。如果將輸入的第二行改為0,則第四個字符串應該輸出。評測用例規模與約定 1<=n<=100,每個字符串的長度不超過100。 |
問題鏈接:CCF201409試題。
問題描述:(參見上文)。
問題分析:這是一個簡單的字符串處理問題,關鍵是對有關字符串處理函數是否熟悉。
程序說明:有關字符串的處理,可以用C語言的函數實現,也可用C++的string變量實現。
提交后得100分的C++語言程序如下:
/* CCF201409-3 字符串匹配 */#include <iostream>#include <cstring>using namespace std;const int N = 100;void mystrlwr(char *ps){ while(*ps) { if('A' <= *ps && *ps <= 'Z') *ps += 'a'-'A'; ps++; }}int main(){ char key[N+1], s[N+1], lowerkey[N+1], lowers[N+1]; int option, n; // 輸入數據 cin >> key >> option >> n; // 獲得key的小寫字符串,放在變量lowerkey中 strcpy(lowerkey, key); mystrlwr(lowerkey); // 循環處理 for(int i=1; i<=n; i++) { cin >> s; if(option == 0) { // 大小寫無關 strcpy(lowers, s); mystrlwr(lowers); if(strstr(lowers, lowerkey)) cout << s << endl; } else { // option = 1,大小寫有關 if(strstr(s, key)) cout << s << endl; } }}在gcc環境中,不支持函數strlwr(),所以需要自己寫一個函數mystrlwr(),在Dev-C++環境中,是支持函數strlwr()的,不需要自己寫該函數,上述的函數mystrlwr()可以直接寫為strlwr()。以下這個程序提交后只得了50分,希望哪位幫助改進一下:
/* CCF201409-3 字符串匹配 */#include <iostream>#include <cctype>#include <string>using namespace std;int main(){ string key, s, kt, st; int option, n; // 輸入數據 cin >> key >> option >> n; // 獲得key的小寫字符串,放在變量kt kt = s; for(int i=0; i<(int)kt.size(); i++) if(isupper(kt[i])) kt[i] = tolower(kt[i]); // 循環處理 for(int i=1; i<=n; i++) { cin >> s; if(option == 0) { // 大小寫無關 st = s; for(int i=0; i<(int)st.size(); i++) if(isupper(st[i])) st[i] = tolower(st[i]); int pos = st.find(kt); if(pos >= 0) cout << s << endl; } else { // option = 1,大小寫有關 int pos = s.find(key); if(pos >= 0) cout << s << endl; } } return 0;}
新聞熱點
疑難解答