题目:
给定两个字符串 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;
};
本文介绍了一种解决字符串重复匹配问题的方法,通过不断重复字符串A直至长度超过B,然后检查B是否为A的子串。提供了C++、Java、Python及JavaScript四种语言的实现示例。
387

被折叠的 条评论
为什么被折叠?



