3292. 形成目标字符串需要的最少字符串数 II

给你一个字符串数组 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]

 

posted @ 2024-12-18 23:31  xiaoxinlong  阅读(17)  评论(0)    收藏  举报
AmazingCounters.com