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;
}
}
}
}