1. 程式人生 > >[LeetCode] Repeated String Match 重複字串匹配

[LeetCode] Repeated String Match 重複字串匹配

Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.

For example, with A = "abcd" and B = "cdabcdab".

Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").

Note:
The length of A and B will be between 1 and 10000.

這道題讓我們用字串B來匹配字串A,問字串A需要重複幾次,如果無法匹配,則返回-1。那麼B要能成為A的字串,那麼A的長度肯定要大於等於B,所以當A的長度小於B的時候,我們可以先進行重複A,直到A的長度大於等於B,並且累計次數cnt。那麼此時我們用find來找,看B是否存在A中,如果存在直接返回cnt。如果不存在,我們再加上一個A,再來找,這樣可以處理這種情況A="abc", B="cab",如果此時還找不到,說明無法匹配,返回-1,參見程式碼如下:

解法一:

class Solution {
public: int repeatedStringMatch(string A, string B) { int n1 = A.size(), n2 = B.size(), cnt = 1; string t = A; while (t.size() < n2) { t += A; ++cnt; } if (t.find(B) != string::npos) return cnt; t += A;
return (t.find(B) != string::npos) ? cnt + 1 : -1; } };

下面這種解法就更簡潔了,思路和上面的一樣,都是每次給t增加一個字串A,我們其實可以直接算出最多需要增加的個數,即B的長度除以A的長度再加上2,當B小於A的時候,那麼可能需要兩個A,所以i就是小於等於2,這樣我們每次在t中找B,如果找到了,就返回i,沒找到,就增加一個A,迴圈推出後返回-1即可,參見程式碼如下:

解法二:

class Solution {
public:
    int repeatedStringMatch(string A, string B) {
        string t = A;
        for (int i = 1; i <= B.size() / A.size() + 2; ++i) {
            if (t.find(B) != string::npos) return i;
            t += A;
        }
        return -1;
    }
};

下面這種解法還是由熱心網友提供,沒有用到字串自帶的find函式,而是逐個字元進行比較,迴圈字串A中的所有字元,然後用個變數j,初始化為0,用來迴圈字串B中的字元,每個字元和A中對應的字元進行比較,此時從A中取字元就要把A當作一個迴圈陣列來處理,用(i+j)%m來取字元,還要確保j小於n,避免越界,如果字元匹配的話,j自增1。while 迴圈結束後,如果j等於n了,說明B中所有的字元都成功匹配了,那麼我們來計算A的重複次數,通過(i+j-1)/m + 1來得到,注意i+j要減1再除以m,之後再加上一次。因為當i+j正好等於m時,說明此時不用重複A,那麼(i+j-1)/m + 1還是等於1,當i+j>m的時候,需要重複A了,(i+j-1)/m + 1也可以得到正確的結構,參見程式碼如下:

解法三:

class Solution {
public:
    int repeatedStringMatch(string A, string B) {
        int m = A.size(), n = B.size();
        for (int i = 0; i < m; ++i) {
            int j = 0;
            while (j < n && A[(i + j) % m] == B[j]) ++j;
            if (j == n) return (i + j - 1) / m + 1;
        }
        return -1;
    }
};

類似題目:

參考資料: