LeetCode686-重复叠加字符串匹配
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。
注意: 字符串 "abc" 重复叠加 0 次是 "",重复叠加 1 次是 "abc",重复叠加 2 次是 "abcabc"。
示例 1:
输入: a = "abcd", b = "cdabcdab"
输出: 3
解释: a 重复叠加三遍后为 "abcdabcdabcd", 此时 b 是其子串。
示例 2:
输入: a = "a", b = "aa"
输出: 2
示例 3:
输入: a = "a", b = "a"
输出: 1
示例 4:
输入: a = "abc", b = "wxyz"
输出: -1
提示:
a和b由小写英文字母组成
思路分析
将验证字符串A首尾相连,那么可以将其看作一个滚轮 接下来使用A的字符依次印刷B,若印刷完毕则返回印刷的字符数量,其实就是B的长度 然后是B的长度减去起始索引(算一个),然后除A的长度,求上限 若印刷不成功且,长度大于A的长度,则证明循环了这时可以结束判断了
首先共hashset加入a的元素 然后再分别加入b的元素 如果加成功了 就直接返回-1 然后看b的长度是a的多少倍 无非就三种情况
如果不一样 就考虑是不是一样长但需要前后加 所以再加一个a 然后看里面存不存在b就好 如果都不是 那就是不一样长切还要两边加 那就是加两个a在判断 然后返回n倍+0或1或2就好
先判断是否所有b的字符都存在于a中,若存在字符k,存在于b中,但不存在于a中,则直接返回-1 然后依次遍历a,发现和b的头字符相同则开始比对
算法代码
public int repeatedStringMatch(String a, String b) {
int[] count = new int[26];
//判断是否有字符k,存在于b,但不存在于a
for (int i = 0; i < a.length(); i++) {
count[a.charAt(i) - 'a'] ++;
}
for (int i = 0; i < b.length(); i++) {
if (count[b.charAt(i) - 'a'] == 0) return -1;
}
//依次遍历a的每个字符
for (int i = 0; i < a.length(); i++) {
//当a的某个字符和b的头字符相同,开始比对
if (a.charAt(i) == b.charAt(0)) {
int start = i;
int j = 0;
while (j < b.length()) {
if (a.charAt(start % a.length()) != b.charAt(j)) break;
j++;
start++;
}
//比对成功,输出结果
if (j == b.length()) {
int ans = start / a.length();
if (start % a.length() != 0) ans++;
return ans;
}
}
}
return -1;
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!