97. 交错字符串
作者:
枳花明
,
2025-01-12 11:28:27
,
所有人可见
,
阅读 2
- 边界条件:如果
s1
和 s2
的长度之和不等于 s3
的长度,直接返回 false
。
- 创建 DP 表:定义一个二维布尔数组
dp
,其中 dp[i][j]
表示 s1
的前 i
个字符和 s2
的前 j
个字符是否能交错组成 s3
的前 i + j
个字符。
- 初始化:
dp[0][0]
为 true
,因为空字符串可以交错组成空字符串。
- 填充 DP 表:
- 遍历
s1
和 s2
,根据字符匹配情况更新 dp
。
- 如果
s1[i-1]
和 s3[i + j - 1]
相等,且 dp[i-1][j]
为 true
,则 dp[i][j]
为 true
。
- 如果
s2[j-1]
和 s3[i + j - 1]
相等,且 dp[i][j-1]
为 true
,则 dp[i][j]
为 true
。
- 返回结果:最终的结果由
dp[len(s1)][len(s2)]
给出。
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n = s1.size();
int m = s2.size();
// f[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i + j 个字符。
vector<vector<bool>> f(n+1,vector<bool>(m+1,false));
s1 = ' '+s1, s2 = ' '+s2, s3 = ' '+s3;
f[0][0] = true;
for( int i=0; i<=n; i++ )
for( int j=0; j<=m; j++ )
{
if( i && s3[i+j] == s1[i] ) f[i][j] = f[i-1][j];
if( j && s3[i+j] == s2[j] ) f[i][j] = f[i][j] || f[i][j-1];
}
return f[n][m];
}
};