首页 > 其他分享 >3292. 形成目标字符串需要的最少字符串数 II

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

时间:2024-12-18 23:45:51浏览次数:3  
标签:word target II words 字符串 pi 3292 前缀

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

相关文章

  • 534. 游戏玩法分析 III - 力扣(LeetCode)
    534.游戏玩法分析III-力扣(LeetCode)目标输入输入:Activitytable:player_iddevice_idevent_dategames_played122016/3/15122016/5/26132017/6/251312016/3/20342018/7/35输出输出:player_idevent_dategames_played_so_far12016/3/1512016/5/21112017/6/251232016/3/......
  • 前端知识点---字符串的函数
    文章目录1.length2.charAt(index)3.indexOf(searchValue,start)4.lastIndexOf(searchValue,start)5.slice(start,end)6.substring(start,end)7.substr(start,length)8.toUpperCase()和toLowerCase()9.trim()10.split(separator)11.replace(searchValue......
  • 59. 螺旋矩阵 II
    螺旋矩阵II给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]思路同54.螺旋矩阵边界控制:我们使用四个变量来控制当前遍历的边界:......
  • 在IIS部署cesium用的倾斜摄影3dtiles服务注意事项(备忘)
    1、将地形或倾斜摄影切片拷贝到IIS服务上,需要添加相应文件的MIME类型(如果缺少自己模型服务的数据类型,直接按扩展名添加,一般都使用application/octet-stream) .json   application/json .terrain  application/octet-stream.b3dm->application/octet-stream.pnts->->a......
  • C语言数组和字符数组和字符串详解
    数组的概念和定义我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类型的内存空间:inta[4];这样,就在内存中分配了4个int类型的内存空间,共4×4=16个字节,并为它们起了一个名字,叫a。我们把这样的一组数据的集合称为数组(Array),它所包含的每一个数据叫......
  • C语言字符串指针
    C语言字符串指针(指向字符串的指针)详解C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下:#include<stdio.h>#include<string.h>intmain(){charstr[]="http://c.biancheng.net......
  • 找到字符串中所有字母异位词
    给定两个字符串 s 和 p,找到 s 中所有 p 的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。示例 1:输入:s="cbaebabacd",p="abc"输出:[0,6]解释:起始索引等于0的子串是"cba",它是"abc"的异位词。起始索引等于6的子串是"bac",它是"abc......
  • C10-8 SQL注入II + XSS练习 I
    情境参加了培训的第八次课,涉及到了SQL宽字节注入,从MySQL注入到GetShell,SQL注入的基本绕过手法,SQL注入防御,SQLmap的使用;XSS基本概念和原理的介绍(包括3种XSS及其手动测试).这里是第八课的作业题,及我的解答.此次作业宽字节注入,需要使用到Pikachu靶场.该靶场......
  • 代码中对字符串的常用操作有哪些?
    在编程中,字符串处理指的是对字符串(由字符组成的序列)进行的各种操作,包括但不限于查找、修改、分割、连接、格式化等。字符串是编程中非常常见的数据类型之一,几乎所有的编程语言都提供了内建的方法和函数来简化字符串的处理。常见的字符串处理操作描述1. 字符串查找描述:在字......
  • 2024-12-18:正方形中的最多点数。用go语言,给定一个二维数组 points 和一个字符串 s,其中
    2024-12-18:正方形中的最多点数。用go语言,给定一个二维数组points和一个字符串s,其中points[i]表示第i个点的坐标,s[i]表示第i个点的标签。如果一个正方形的中心在(0,0),边与坐标轴平行,并且内部没有标签相同的两个点,则称这个正方形为“合法”的。你的任务是返回可以被“合......