1. 题目描述
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。
示例 1:
示例 2:
2. 解题思路
s1 , s2 组成 s3 过程中不能改变 s1, s2 的字符顺序,示例2中 s1, s2 字符和与 s3 相同,但由于不能改变s1, s2 的字符顺序,结果为 false.
90%的字符串问题可由动态规划解决,本题就是一道动态规划问题。
首先找出状态转移方程:
假设 dp[i][j] 代表 s1 的前 j 个字符与 s2 的前 i 个字符能否交错组成 s3 的 前 (i + j) 个字符。
如果为True,又代表着 s1 的第 j 个字符或者 s2 的第 i 个字符与 s3 的第(i + j)个字符相等。
接下来找出状态转移方程:
dp[i][j] = 1, s1.charAt(j-1) == s3.charAt(i+j-1) && dp[i][j-1] == 1;
dp[i][j] = 1, s2.charAt(i-1) == s3.charAt(i+j-1) && dp[i-1][j] == 1;
其余情况都为0;
即当 s1 的第 j 个字符或者 s2 的第 i 个字符与 s3 的第(i + j)个字符相等,并且 dp[i][j-1] 或者 dp[i-1][j] 等于 1.
dp[i][j-1] 或者 dp[i-1][j]等于 1 代表着能交错组成s3 的 前 (i + j-1) 个字符。如果s1 的第 j 个字符与 s3 的第(i + j)个字符
相等,只需能交错组成s3 的 前 (i + j-1) 个字符,由于 s1 的第 j 个字符用于组成s3 的第(i + j)个字符,所以需要dp[i][j-1