1. 程式人生 > >codeVS之旅:1204 尋找子串位置

codeVS之旅:1204 尋找子串位置

題目描述 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;
}