1. 程式人生 > >經典演算法學習——求包含某兩個字元的最小子串的長度

經典演算法學習——求包含某兩個字元的最小子串的長度

       碰到這樣一道演算法題:給定一個字串,比如: cadacacbedffffreaaawc   ,然後給定兩個字元為f,c  ,那麼最短子串的長度為5。因為子串有cbedf,freaaawc.  這篇部落格考慮的比較簡單,是隻有兩個字元的情況,我會在後續的部落格中講解如果需要包含多個字元那麼應該如何處理。本篇的程式碼上傳至 https://github.com/chenyufeng1991/MaxLengthSubString 。

       這裡的實現思路比較簡單,對string進行一次遍歷,分別記錄出現字元a,字元b的下標index,分別儲存到兩個陣列或者vector中。那麼現在在vectorA中儲存的下標位置就是出現a字元的所有位置,vectorB中儲存的下標位置就是出現b字元的所有位置。最後即可通過迴圈查詢兩者最接近的差值即可。核心程式碼實現如下:

 cout << "請輸入字串:";
    string stringIn;
    cin >> stringIn;
    cout << "請輸入兩個字元:";
    char a, b;
    cin >> a >> b;

    vector<int> vectorA;
    vector<int> vectorB;
    for (int i = 0; i < stringIn.size(); i++)
    {
        if (stringIn[i] == a)
        {
            vectorA.push_back(i);
        }

        if (stringIn[i] == b)
        {
            vectorB.push_back(i);
        }
    }

    if (vectorA.empty() || vectorB.empty())
    {
        cout << "最短子串為:0"<< endl;
    }
    else
    {
        int minLength = (int)stringIn.size();
        for (int i = 0; i < vectorA.size(); i++)
            for (int j = 0; j < vectorB.size(); j++)
            {
                minLength = min(minLength, abs(vectorA[i]-vectorB[j]) + 1);
            }

        cout << "最短子串為:"<< minLength << endl;
    }