C++ 中的交错字符串
c++server side programmingprogramming更新于 2025/6/25 22:07:17
假设我们有三个字符串 s1、s2 和 s3。检查 s3 是否由 s1 和 s2 交错而成。因此,如果字符串为 “aabcc”,s2 = “dbbca”,s3 为 “aadbbcbcac”,则结果为 true。
为了解决这个问题,我们将遵循以下步骤 −
定义一个名为solve()的方法,它将接受s1、s2、s3和一个三维数组dp,然后是i、j、k
如果i = 0且j = 0且k = 0,则返回true
如果dp[i, j, k]不为-1,则返回dp[i, j, k]
ans := false
如果j > 0 且 k >= 0 且 s2[j] = s3[k],则
ans := resolve(s1, s2, s3, dp, i – 1, j, k – 1)
如果 j > 0 且 k >= 0,且 s2[j] = s3[k],则
ans := ans 或 resolve(s1, s2, s3, dp, i, j – 1, k – 1)
设置 dp[i, j, k] := ans
返回 dp[i, j, k]
在 main 方法中,执行以下操作 −
n := s1 的大小,m := s2 的大小,o := s3 的大小
在 s1、s2、s3 之前添加一个空格。
make一个大小为 (n + 1) x (m + 1) x (o + 1) 的数组,用 -1 填充
return solve(s1, s2, s3, dp, n, m, o)
示例
让我们看看下面的实现以便更好地理解 −
#include <bits/stdc++.h> using namespace std; class Solution { public: bool solve(string s1, string s2, string s3, vector < vector < vector <int>>>& dp, int i, int j, int k){ if(i ==0 && j == 0 && k == 0)return true; if(dp[i][j][k] !=-1)return dp[i][j][k]; bool ans = false; if(i > 0 && k >= 0 && s1[i] == s3[k]){ ans = solve(s1, s2, s3, dp, i - 1, j, k - 1); } if(j >0 && k >=0 && s2[j] == s3[k]){ ans |= solve(s1, s2, s3, dp, i, j - 1, k - 1); } return dp[i][j][k] = ans; } bool isInterleave(string s1, string s2, string s3) { int n = s1.size(); int m = s2.size(); int o = s3.size(); s1 = " " + s1; s2 = " " + s2; s3 = " " + s3; vector < vector < vector <int>>> dp(n + 1, vector < vector <int>>(m + 1, vector <int> (o + 1, -1))); return solve(s1, s2, s3, dp, n , m , o ); } }; main(){ Solution ob; cout << (ob.isInterleave("aabcc", "dbbca", "aadbbcbcac")); }
输入
"aabcc", "dbbca", "aadbbcbcac"
输出
1