C++中的字符串交织


假设我们有三个字符串 s1、s2 和 s3。然后检查 s3 是否由 s1 和 s2 交织而成。因此,如果字符串为“aabcc”,s2 = “dbbca”,s3 为“aadbbcbcac”,则结果将为真。

为了解决这个问题,我们将按照以下步骤进行 −

  • 定义一个名为 solve() 的方法,该方法将获取 s1、s2、s3 和一个 3D 数组 dp,然后获取 i、j、k

  • 如果 i = 0 且 j = 0 且 k = 0,则返回真

  • 如果 dp[i, j, k] 不为 -1,则返回 dp[i, j, k]

  • ans := 假

  • 如果 j > 0 且 k >= 0 且 s2[j] = s3[k],则

    • ans := solve(s1, s2, s3, dp, i – 1, j, k – 1)

  • 如果 j > 0 且 k >= 0 且 s2[j] = s3[k],则

    • ans := ans OR solve(s1, s2, s3, dp, i, j – 1, k – 1)

  • 设置 dp[i, j, k] := ans

  • 返回 dp[i, j, k]

  • 使用主方法,执行以下操作 −

  • n := s1 的大小,m := s2 的大小,o := s3 的大小

  • 在 s1、s2、s3 之前添加一个空格。

  • 制作一个大小为 (n + 1) x (m + 1) x (o + 1) 的数组,并将其填充为 -1

  • 返回 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

更新日期: 2020-5-26

375 次浏览

提升您的职业生涯

完成课程获得认证

开始
广告