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.
思路:首先判断s和t的长度,1. 如果s.length >= t.length, 那么就看s中有没有包含t,如果包含了,则返回1,如果没包含,s最多重复一次就可以看出包含关系,重复后包含则返回2,不包含则返回-1;2. 如果s.length < t.length,重复s足够多次(h次),如果s包含t, 则返回重复的次数,如果s不包含t,则返回-1,至于h的取值,取决于s的首尾的情况,如果s中重复的t的字段以外,首尾有多余的则重复次数+2,首尾有一方多余的+1,首尾都不多余为t重复的次数。
public int repeatedStringMatch(String A, String B) {
String s = A, t = B;
int sl = s.length(), tl = t.length();
if (sl == 0 || tl == 0) return -1;
if (sl < tl) {
int index = t.indexOf(s), j = sl - 1, h = 0;
if (index > 0) {
if (!t.substring(tl - sl).equals(s)){
h = (tl - index) / sl + 2;
} else {
h = (tl - index) / sl + 1;
}
}else {
if (tl % sl != 0) {
h = tl / sl + 1;
} else {
h = tl / sl;
}
}
String str = "";
for (int i = 0; i < h; i++) {
str += s;
}
if (str.indexOf(t) == -1) return -1;
else return h;
} else {
if (s.indexOf(t) != -1) return 1;
String repeat = s + s;
if (repeat.indexOf(t) == -1) return -1;
else return 2;
}
}