给你一个字符串数组 words
和一个字符串 target
。
如果字符串 x
是 words
中 任意 字符串的
x
是一个 有效 字符串。
现计划通过 连接 有效字符串形成 target
,请你计算并返回需要连接的 最少 字符串数量。如果无法通过这种方式形成 target
,则返回 -1
。
示例 1:
输入: words = ["abc","aaaaa","bcdef"], target = "aabcdabc"
输出: 3
解释:
target 字符串可以通过连接以下有效字符串形成:
words[1]
的长度为 2 的前缀,即"aa"
。words[2]
的长度为 3 的前缀,即"bcd"
。words[0]
的长度为 3 的前缀,即"abc"
。
示例 2:
输入: words = ["abababab","ab"], target = "ababaababa"
输出: 2
解释:
target 字符串可以通过连接以下有效字符串形成:
words[0]
的长度为 5 的前缀,即"ababa"
。words[0]
的长度为 5 的前缀,即"ababa"
。
示例 3:
输入: words = ["abcdef"], target = "xyz"
输出: -1
提示:
1 <= words.length <= 100
1 <= words[i].length <= 5 * 104
- 输入确保
sum(words[i].length) <= 105
. words[i]
只包含小写英文字母。1 <= target.length <= 5 * 104
target
只包含小写英文字母。
class Solution: def minValidStrings(self, words: List[str], target: str) -> int: def prefix_function(word, target): s = word + '#' + target n = len(s) pi = [0] * n for i in range(1, n): j = pi[i - 1] while j > 0 and s[i] != s[j]: j = pi[j - 1] if s[i] == s[j]: j += 1 pi[i] = j return pi n = len(target) back = [0] * n for word in words: pi = prefix_function(word, target) m = len(word) for i in range(n): back[i] = max(back[i], pi[m + 1 + i]) dp = [0] + [10 ** 9] * n for i in range(n): dp[i + 1] = dp[i + 1 - back[i]] + 1 if dp[i + 1] > n: return -1 return dp[n]
标签:word,target,II,words,字符串,pi,3292,前缀 From: https://www.cnblogs.com/xxlm/p/18616054