2021-12-22每日一题
给定两个字符串 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
提示:
1 <= a.length <= 104
1 <= b.length <= 104
a
和b
由小写英文字母组成
1 import java.util.ArrayList; 2 3 public class repeatedStringMatch { 4 public int repeatedMatch(String a, String b) { 5 //记录b首字母在a中的所有索引 6 ArrayList<Integer> list = new ArrayList<>(); 7 for (int i = 0; i < a.length(); i++) { 8 if (a.charAt(i)==b.charAt(0)) list.add(i); 9 } 10 //依次遍历 开始匹配,超过a字符串就mod长度继续匹配直到匹配不上或者b遍历结束 11 for (Integer integer : list) { 12 int ans = 0, temp = integer; 13 boolean flag = true; 14 for (int j = 0; j < b.length(); j++) { 15 if (a.charAt(temp) == b.charAt(j)) { 16 temp++; 17 if (temp >= a.length()) { 18 temp %= a.length(); 19 ans++; 20 } 21 } else { 22 //匹配失败 23 flag = false; 24 break; 25 } 26 } 27 //如果下一次比较的下标变为0,说明刚好经过整个a,否则需要新的一段a拼接匹配,所以+1 28 if (temp != 0) ans++; 29 if (flag) return ans; 30 } 31 return -1; 32 } 33 34 public static void main(String[] args) { 35 int i = new repeatedStringMatch().repeatedMatch("bb", "bbbbbbb"); 36 System.out.println(i); 37 } 38 }
官方KMP算法太难了,回头再补