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.

給定兩個字串 A 和 B, 尋找重複疊加字串A的最小次數,使得字串B成為疊加後的字串A的子串,如果不存在則返回 -1。

舉個例子,A = "abcd",B = "cdabcdab"。

答案為 3, 因為 A 重複疊加三遍後為 “abcdabcdabcd”,此時 B 是其子串;A 重複疊加兩遍後為"abcdabcd",B 並不是其子串。

注意:

 A 與 B 字串的長度在1和10000區間範圍內。

題解,拿到這道題,就想到要分兩種情況,第一種為如果字串A的長度大於或等於B,這裡也要考慮兩種情況,即字串A已經包含有字串B了,那麼直接返回1;如果此時字串A不包含,但是如果字串A再新增一遍自己後,也就是現在有兩個A了,此時如果包含有B,則返回2;否則返回-1。這是特別需要注意的地方。比如字串A為“bbbba”,字串B為"ab",則此時需要考慮第二種情況,需要將字串A複製兩遍,才可以滿足包含有字串B。

第二種情況是字串A的長度小於B,我採用的方法是在這種情況下再細分為2種子情況,即先算出字串B最少需要多少個字串A,即用整除和除餘分別得到,如果是被整除了,那也得按照第一種情況下一樣,考慮是按照整除新增 or 再加一遍來驗證;同樣,如果是沒有被整除,那也得考慮這兩種子情況。

所以待這些情況都考慮完之後,那就能accept了,這種思路是非常簡單,但是也非常考驗思路的全面性的,所以後期還是需要尋找更簡單的思路來解題。

public static int repeatedStringMatch(String A,String B)
    {
        int length1 = A.length();
        int length2 = B.length();
        if(length1 >= length2)
        {
            if(A.contains(B))
                return 1;
            else
            {
                String temp1 = A;
                temp1 += A;
                if(temp1.contains(B))
                    return 2;
                else
                    return -1;
            }
        }
        else
        {
            int num1 = length2 / length1;
            int num2 = length2 % length1;
            String temp2 = A;
            if(num2 != 0)
            {
                for(int i = 1; i <= num1; i++)
                    temp2 += A;
                if(temp2.contains(B))
                    return num1 + 1;
                else
                {
                    temp2 += A;
                    if(temp2.contains(B))
                        return num1 + 2;
                    else
                        return -1;
                }

            }
            else
            {
                for(int i = 1; i <= num1 - 1; i++)
                    temp2 += A;
                if(temp2.contains(B))
                    return num1;
                else
                {
                    temp2 += A;
                    if(temp2.contains(B))
                        return num1 + 1;
                    else
                        return -1;
                }
            }
        }
    }