题目:
给定两个字符串 A
和 B
, 寻找重复叠加字符串A
的最小次数,使得字符串B
成为叠加后的字符串A
的子串,如果不存在则返回 -1
。
举个例子,A = "abcd"
,B = "cdabcdab"
。
答案为 3
, 因为 A
重复叠加三遍后为 “abcdabcdabcd”
,此时 B 是其子串;A 重复叠加两遍后为”abcdabcd”,B 并不是其子串。
注意:
A
与 B
字符串的长度在1和10000区间范围内。
题解:
核心思想是不断重复A
得到res
,直到长度大于等于B
。如果res
包含B
,则返回true
,如果不包含,可以令res
再加一次A
,此时包含B
则返回true
,不包含则直接返回false
。
例如 A = "abcd"
,B = "cdabcdab"
,A
重复两次后得到res = "abcdabcd"
,此时res
不包含B
,但res + A
后则包含B
。
C++
class Solution {
public:
int repeatedStringMatch(string A, string B) {
string res = A;
int cnt = 1;
while(res.size() < B.size()){
res += A;
cnt++;
}
if(res.find(B) != string::npos) {
return cnt;
}
res += A;
if(res.find(B) != string::npos) {
return cnt + 1;
}
return -1;
}
};
Java
class Solution {
public int repeatedStringMatch(String A, String B) {
int lB = B.length();
String res = A;
int cnt = 1;
while( res.length() < lB) {
res += A;
cnt++;
}
if(res.contains(B)) {
return cnt;
}
res += A;
if(res.contains(B)) {
return cnt + 1;
}
return -1;
}
}
Python
class Solution(object):
def repeatedStringMatch(self, A, B):
"""
:type A: str
:type B: str
:rtype: int
"""
lenB = len(B)
res = A
cnt = 1
while(len(res) < lenB):
res += A
cnt += 1
if(res.find(B) != -1):
return cnt
res += A
if(res.find(B) != -1):
return cnt + 1
return -1
JavaScript
/**
* @param {string} A
* @param {string} B
* @return {number}
*/
var repeatedStringMatch = function(A, B) {
var lenB = B.length;
var res = A;
var cnt = 1;
while (res.length < lenB) {
res += A;
cnt++;
}
if(res.indexOf(B) != -1) {
return cnt;
}
res += A;
cnt++;
if(res.indexOf(B) != -1) {
return cnt;
}
return -1;
};