算法初探LeetCode-重复叠加字符串匹配

113 阅读2分钟

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

提示:

  • 1<=a.length<=1041 <= a.length <= 10^4
  • 1<=b.length<=1041 <= b.length <= 10^4
  • 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;
}

结果详情

Snipaste_2023-05-04_22-29-04.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!