codeVS之旅:1204 尋找子串位置
阿新 • • 發佈:2018-11-09
題目描述 Description http://codevs.cn/problem/1204/
給出字串a和字串b,保證b是a的一個子串,請你輸出b在a中第一次出現的位置。
輸入描述 Input Description
僅一行包含兩個字串a和b
輸出描述 Output Description
僅一行一個整數
樣例輸入 Sample Input
abcd bc
樣例輸出 Sample Output
2
資料範圍及提示 Data Size & Hint
解題思路:這個題開始的時候我以為很簡單,後來細想一下沒有考慮第一個字母相同而後面可能不同的情況。但是順著往下想如果不同的話就需要退回對a的遍歷,因此可以用一個新的變數j去參與迴圈。這裡面還有一個很重要的事是注意b[n]!='\0';這個判斷條件,開始我沒注意,但是當b的陣列越界的時候也會出錯。
思路就是先從a中找到與b[0]相等的位置,然後分別比較b[n]與a[j],n和j分別遞增,同時記錄此時經過的a的長度len_a,當比較結束時有兩種情況,一種是b已經遍歷完了,此時len_a = strlen(b), 另一種是b中出現了與a中不同的,說明這次選取的開始位置是錯誤的,此時利用break跳出迴圈,繼續從i+1處與b[0]進行比較。
程式碼如下:
#include <iostream> #include<cstdio> #include<cstring> using namespace std; int main() { char a[100]; char b[100]; cin>>a>>b; for(int i=0; ; i++) { if(b[0] == a[i]) { int len_a = 0; int n = 0; for(int j=i; b[n]!='\0';n++) { if(b[n]==a[j]) { len_a ++; j++; }else break; } if(len_a == strlen(b)) { cout<<i+1<<endl; break; } } } return 0; }