题目
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。
注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”。
示例
-
示例一
输入: a = “abcd”, b = “cdabcdab”
输出:3
解释:a 重复叠加三遍后为 “abcdabcdabcd”, 此时 b 是其子串。 -
示例二
输入:a = “a”, b = “aa”
输出:2 -
示例三
输入:a = “a”, b = “a”
输出:1 -
示例四
输入:a = “abc”, b = “wxyz”
输出:-1
方法
直接计算
class Solution {
public int repeatedStringMatch(String a, String b) {
StringBuilder sb = new StringBuilder();
int ans = 0;
while (sb.length() < b.length() && ++ans > 0) sb.append(a);
sb.append(a);
int idx = sb.indexOf(b);
if (idx == -1) return -1;
return idx + b.length() > a.length() * ans ? ans + 1 : ans;
}
}
- 如果b能在a的n次复制内出现,则其实下标一定在第一个a字符串内,因为后面都是重复内容,如果第一个a无法匹配,则整个字符串就无法匹配。
- a的复制次数的下界一定是复制之后字符串长度大于b。
- 如果b在复制后的a字符串的结尾部分超过了下界,则还需要再复制一次。

545

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



