给定两个字符串 ab ,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1
注意: 字符串 "abc" 重复叠加 0 次是 "" ,重复叠加 1 次是 "abc" ,重复叠加 2 次是 "abcabc"
示例 1:

  1. 输入:a = "abcd", b = "cdabcdab"
  2. 输出:3
  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 <= 10^4
  • 1 <= b.length <= 10^4
  • ab 由小写英文字母组成

    解法一:二分法

func repeatedStringMatch(a string, b string) int {
    if b == "" {
        return 0
    }
    left, right := 0, len(b)/len(a)+2
    for left <= right {
        mid := left + (right-left)>>1
        if strings.Contains(strings.Repeat(a, mid), b) {
            if mid == 0 || !strings.Contains(strings.Repeat(a, mid-1), b) {
                return mid
            }
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    return -1
}