首页 > 其他分享 >交错字符串

交错字符串

时间:2024-04-29 11:11:25浏览次数:14  
标签:s3 s2 s1 元素 交错 字符串 dp

https://leetcode.cn/problems/interleaving-string/description/?envType=study-plan-v2&envId=top-interview-150

以下是通过动态规划解决该问题的正确方法。首先,如果字符串 s1 和 s2 的长度之和不等于字符串 s3 的长度,即 |s1| + |s2| ≠ |s3|,那么字符串 s3 不可能由字符串 s1 和 s2 交错组成。当 |s1| + |s2| = |s3| 时,我们可以使用动态规划来求解。

我们定义 f(i, j) 表示字符串 s1 的前 i 个元素和字符串 s2 的前 j 个元素是否能交错组成字符串 s3 的前 i+j 个元素。如果字符串 s1 的第 i 个元素和字符串 s3 的第 i+j 个元素相等,那么字符串 s1 的前 i 个元素和字符串 s2 的前 j 个元素是否能交错组成字符串 s3 的前 i+j 个元素取决于字符串 s1 的前 i-1 个元素和字符串 s2 的前 j 个元素是否能交错组成字符串 s3 的前 i+j-1 个元素,即此时 f(i, j) 取决于 f(i-1, j)。在这种情况下,如果 f(i-1, j) 为真,则 f(i, j) 也为真。同样地,如果字符串 s2 的第 j 个元素和字符串 s3 的第 i+j 个元素相等,并且 f(i, j-1) 为真,则 f(i, j) 也为真。因此,我们可以得出以下动态规划转移方程:

f(i, j) = [f(i-1, j) and s1(i-1) = s3(p)] or [f(i, j-1) and s2(j-1) = s3(p)]

其中,p = i + j - 1。

这种动态规划的思路可以帮助我们判断字符串 s3 是否可以由字符串 s1 和 s2 交错组成。
注意: 这道题不能用双指针,双指针只能用于连续字符串,不能用于交错字符串

class Solution:
    def isInterleave(self, s1: str, s2: str, s3: str) -> bool:


        m, n = len(s1), len(s2)
        if m + n != len(s3):
            return False

        dp = [[False] * (n + 1) for _ in range(m + 1)]
        dp[0][0] = True

        for i in range(1, m + 1):
            dp[i][0] = dp[i - 1][0] and s1[i - 1] == s3[i - 1]

        for j in range(1, n + 1):
            dp[0][j] = dp[0][j - 1] and s2[j - 1] == s3[j - 1]

        for i in range(1, m + 1):
            for j in range(1, n + 1):
                dp[i][j] = dp[i - 1][j] and (s1[i - 1] == s3[i + j - 1] or s2[j - 1] == s3[i + j - 1])

        return dp[m][n]

标签:s3,s2,s1,元素,交错,字符串,dp
From: https://www.cnblogs.com/peterzh/p/18165252

相关文章

  • python可复用代码(连接数据库/字符串处理/爬虫/日志配置)【1】
    importpymysqlimportloggingimporttimeimportrandomimportloggingimportrequestsfrombs4importBeautifulSoup"""获取数据库连接"""#连接数据库获取游标defget_conn():""":return:连接,游标""&qu......
  • UES-02-字符串与正则
    Unicode支持16位二进制数称为一个码元,原先的UTF-16中一个码元表示一个字符。现今的UTF-16中,一个代码点表示一个字符,一个代码点由一个码元或者两个连续的码元表示,也就是一个字符由一个码元或者两个连续的码元表示。字符串的codePointAt()方法接收一个索引值,返回字符串中......
  • oracle小技巧:字符串原样输出
       在sql查询中,我们经常需要原样输出字符串,如果字符串中含有大量的单引号、双引号或者特殊字符,那么需要用单引号转义拼接字符串,这样会非常的麻烦。      oracle提供了一个Q-quote的表达式来原样输出字符串。SELECTQ'[I'maboy,mynameis'david']'FROMDUAL......
  • 字符串置换
    3.1LintCode211-字符串置换  boolPermutation(string&A,string&B){  解法一:单纯使用数组计数,缺点是对如果带有特殊符号的字符串是无法处理的时间复杂度是O(n)#include<iostream>usingnamespacestd;constintN=1e5+10;intcnt1[26];intcnt2[26];bool......
  • 陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密
    陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密  这种专利权人是公司,个人是发明人,专利年费是申请人先垫付,然后公司报销了,这个专利本身就不属于员工的这个是公司是专利权人, 使用权是公司,如果想要维持权利的话,需要缴纳年费,专利发明现在一个市......
  • 顺序栈十进制转十六进制,还有键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串
    设计一个进制转换程序,使用顺序栈设计一个把十进制数转换为十六进制数的接口,实现当通过键盘输入一个非负的十进制数,可以在终端输出对应的十六进制数。*@brief :十进制转十六进制*@param :@Segstackt*Manager:地址* @unsignedintData:转换的值*@re......
  • 一道关于顺序栈的笔试题:判断一个包含'('和')'的字符串是否有效
    若有一个包括'('和')'的字符串string,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:A.左括号必须用相同类型的右括号闭合。B.左括号必须以正确的顺序闭合。C.每个右括号都有一个对应的相同类型的左括号。思路图:参考代码:boolSeq......
  • 字符串里找数字
    #include<iostream>#include<string>#include<cctype>intmain(){std::stringinput;std::cout<<"请输入一个字符串:";std::getline(std::cin,input);//读取一行输入std::stringnumber;//用来存储找到的数字std::cou......
  • 如何在 C# 中使用 String.Split 分隔字符串
    一直以为split是用来分隔字符的,没想到还可以分隔数组。让程序变得更简单。微软官网的介绍在此记录下。https://learn.microsoft.com/zh-cn/dotnet/csharp/how-to/parse-strings-using-split 1、分单个字符stringphrase="Thequickbrownfoxjumpsoverthelazydog.";......
  • Android保存字符串到本地储存卡中saveLocal
    publicclassSaveLocal{//保存文件到sd卡publicstaticvoidsaveToFile(Stringcontent){BufferedWriterout=null;//获取SD卡状态Stringstate=Environment.getExternalStorageState();//判断SD卡是否就绪if(......