題目描述
一般的文本編輯器都有查找單詞的功能,該功能可以快速定位特定單詞在文章中的位置,有的還能統計出特定單詞在文章中出現的次數。
現在,請你編程實現這一功能,具體要求是:給定一個單詞,請你輸出它在給定的文章中出現的次數和第一次出現的位置。注意:匹配單詞時,不區分大小寫,但要求完全匹配,即給定單詞必須與文章中的某一獨立單詞在不區分大小寫的情況下完全相同(參見樣例1 ),如果給定單詞僅是文章中某一單詞的一部分則不算匹配(參見樣例2 )。
輸入格式
共22行。
第11行爲一個字符串,其中只含字母,表示給定單詞;
第22行爲一個字符串,其中只可能包含字母和空格,表示給定的文章。
輸出格式
一行,如果在文章中找到給定單詞則輸出兩個整數,兩個整數之間用一個空格隔開,分別是單詞在文章中出現的次數和第一次出現的位置(即在文章中第一次出現時,單詞首字母在文章中的位置,位置從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。
noip2011普及組第2題,洛谷新手村。
本題思路:
-
本來打算使用scanf("%s")來實現一個接着一個的單詞輸入,並strcmp判斷。
#include<bits/stdc++.h> using namespace std; int main() { char s[20]; char p[20]; char t[20]; char x; int cnt=0; scanf("%s",s); strcpy(p,s); if(s[0]>='A'&&s[0]<='Z') p[0]=s[0]+32; if(s[0]>='a'&&s[0]<='z') p[0]=s[0]-32; int i=0; int index=0; scanf("%s",t); x=getchar(); while(x!='\n'){ if(strcmp(t,s)||strcmp(t,p)){ if(cnt==0) index=i; cnt++; }i++; scanf("%s",t); x=getchar(); } if(cnt==0)printf("-1"); else printf("%d %d",cnt,index); return 0; }
但是經過測試發現,%s後並不會將此單詞的下一個單詞計入,而是跳轉到下一行,繼續。與題意不符。而且單詞的長度不確定。所以轉變思路使用getchar一個一個判斷。
-
最後採用以下思路:
#include<bits/stdc++.h> using namespace std; string sent,word; int lens,lenw,t,pos; int main() { getline(cin,word); getline(cin,sent); //字符串含有空格輸入,不可以用cin,否則to me只能讀到to lenw=word.size(); lens=sent.size(); int j; for(int i=0;i<lenw;i++) word[i]=toupper(word[i]); //轉成大寫 for(int i=0;i<lens;i++) sent[i]=toupper(sent[i]); t=0; for(int i=0;i<=lens-lenw;i++){ for( j=0;j<lenw;j++){ if(sent[i+j]!=word[j])break; if(i>0&&sent[i-1]!=' ')break; }//用於判斷是否爲逐字符合。 if(j==lenw&&(sent[i+j]==' '||i+j==lens)) //判斷條件是否符合 { t++; if(t==1)pos = i; } } if(t==0)cout<<-1; else cout<<t<<" "<<pos; return 0; }
上述答案的作者爲: Zehra
以上即爲解答,希望能幫助到大家。然而在尋找解題方案的過程中,我還發現許多大佬的許多種方案:比如,利用指針,比如創建了狀態機,根據不同的狀態跑程序,但是略微有些麻煩,於是決定使用以上的方案。