97. 交错字符串

题目描述:

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出: true
示例 2:

输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出: false

思路:

设dp[i][j]表示s3的前i+j个字符可以由s1的前i个字符和s2的前j个字符交织而成。
就近原则
状态转移方程:有两种情况

第一个状态转移方程:
dp[i][j]= {(dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)}
dp[i-1][j]表示若s3的前i+j-1个字符能够由s1前i-1个字符和s2的前j个字符交织而成,
那么只需要s1的第i个字符与s3的第i+j个字符相等(charAt索引从0开始),那么dp[i][j]=true;
第二个状态转移方程:
dp[i][j]= {(dp[i][j-1] && s2.charAt(j - 1) == s3.charAt(i + j - 1)}
dp[i-1][j]表示若s3的前i+j-1个字符能够由s1前i个字符和s2的前j-1个字符交织而成,
那么只需要s2的第j个字符与s3的第i+j个字符相等(charAt索引从0开始),那么dp[i][j]=true;

这种字符串类型的动态规划和以前遇到的动态规划类似,
只不过每一个位置的处理情况(s3每一个位置的处理情况分为两种:用s1,或者用s2)有好几种,

其实这个问题我们还可以从第一个位置开始处理后决定后面的子问题,这样似乎显得的更自然一些
第一个位置可以用s1的第一个字符,如果s1[1] == s3[1] ,然后判断子问题s1[2:size1],s2[1:size2],s3[2:size3]
如果s2[1] == s3[1],然后判断子问题s1[1:size1],s2[2:size2],s3[2:size3]
不过这样解决问题,书写上不如从最后处理流畅

动态规划 流式处理 如何分解整个问题为子问题:一步的状态定过后,其子问题的分解状态去向就确定了

动态规划:更新一个值(最大最小) 获得当前阶段阶段的值(一个数值,裴波那切数列,多个值,一个数值数组,格雷码)
得到当前阶段的计数值:相加,得到当前阶段时的状态情况:枚举当前位置的不同处理,转向不同子问题状态,然后
对所有的情况做并(||)。

代码:

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {

    	int size1 = s1.size();
        int size2 = s2.size();
        int size3 = s3.size();
        if(size1+size2 != size3)
            return false;
        vector<vector<bool> > dp(size1+1, vector<bool>(size2+1, false));
        for(int i = 0; i <= size1; i ++)
        {
            for(int j = 0; j <= size2; j ++)
            {
                if(i == 0 && j == 0)
                // start
                    dp[i][j] = true;
                else if(i == 0)
                    dp[i][j] = dp[i][j-1] && (s2[j-1]==s3[j-1]);
                else if(j == 0)
                    dp[i][j] = dp[i-1][j] && (s1[i-1]==s3[i-1]);
                else
                    dp[i][j] = (dp[i][j-1] && (s2[j-1]==s3[i+j-1])) || (dp[i-1][j] && (s1[i-1]==s3[i+j-1]));
            }
        }
        return dp[size1][size2];
    }
};

  

原文地址:https://www.cnblogs.com/zjuhaohaoxuexi/p/11789720.html

时间: 2024-10-16 04:28:36

97. 交错字符串的相关文章

[leetcode] 97. 交错字符串

97. 交错字符串 题不难,dfs加回溯即可.实际上就是暴力搜索,穷举所有选择路径. 以s3的每一个字母做一个状态,就面临两个抉择,选s1还是选s2.选s1路不通的话,回溯回来改选s2即可. class Solution { // 状态:String s1, String s2, String s3, int p, int q, int i // p为当前s1的下标指针,q为当前s2的下标指针,i为s3的 boolean dfs(String s1, String s2, String s3,

leetCode 97.Interleaving String (交错字符串) 解题思路和方法

Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbbaccc", return false. 思路:此题刚开始有点想当然了

LeetCode(97):交错字符串

Hard! 题目描述: 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出: true 示例 2: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" 输出: false 解题思路:

交错字符串——动态规划

题目描述: 给定三个字符串A, B, C,判断C是否由A和B交错构成.交错构成的意思是,对于字符串C,可以将其每个字符标记为A类或B类,使得我A类的每个字符顺序构成了A字符串,B类的每个字符顺序构成了B字符串.如:对于A="rabbit" B="mq", "rabmbitq"是由A和B交错构成的,但"rabbqbitm"不是由A和B交错构成. 解题思路: 1.直接顺序比较,从C中依次拿掉A,看剩下的是不是等于B,若是则返回tr

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

计算 num 的 n 次幂、n 的阶乘、斐波那契数列、字符串的字节长度、去除字符串中的重复字符

1 //计算 num 的 n 次幂 2 function numPow(num, n) { 3 if (n == 1) { 4 return num; 5 } 6 return num * numPow(num, n - 1); 7 } 8 9 //计算 n 的阶乘 10 function nFactorial(n) { 11 if (n == 1) { 12 return 1; 13 } 14 return n * nFactorial(n - 1); 15 } 16 17 //斐波那契数列,

Python内建方法

参考: https://docs.python.org/3.4/library/functions.html https://docs.python.org/2/library/functions.html http://blog.csdn.net/jgood/article/details/4371991 以上链接分别为Python官网的3.4版本的内建方法说明.2.X(指2.6和2.7)版本的内建方法说明.以及JGood对2.X版本的内建方法说明的翻译. abs(x) 返回一个数的绝对值.参

SQL Server2008函数大全(完整版)

SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合. 1. 字符串函数 函数 名称 参数 示例 说明 ascii(字符串表达式) select ascii('abc') 返回 97 返回字符串中最左侧的字符的ASCII 码. char(整数表达式) select char(100) 返回 d 把ASCII 码转换为字符. 介于0 和 255 之间的整数.如果该整数表达式不在此范围内,将返回 NULL 值. charindex(字符串表达式 1, 字符串表达式2[,整数表达式])

(JAVA)从零开始之--打印流PrintStream记录日志文件

这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. 1 File file = new File("F:\\a.txt"); 2 FileOutputStream outputStream = new FileOutputStream(file,true);//第二个参数为追加文本 3 outputStream.write(97); 上面的代码执行完之后,a.txt中的内容存的