题目:
给定两个字符串 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;};复制代码