สมมติว่าเรามีสามสตริง s1, s2 และ s3 จากนั้นตรวจสอบว่า s3 เกิดขึ้นจากการสลับระหว่าง s1 และ s2 หรือไม่ ดังนั้นหากสตริงเป็น “aabcc”, s2 =“dbbca” และ s3 คือ “aadbbcbcac” ผลลัพธ์จะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการหนึ่งที่เรียกว่า Solve() ซึ่งจะใช้เวลา s1, s2, s3 และอาร์เรย์ 3 มิติหนึ่งรายการ dp จากนั้น i, j, k
-
ถ้า i =0 และ j =0 และ k =0 ให้คืนค่า true
-
ถ้า dp[i, j, k] ไม่ใช่ -1 ให้คืนค่า dp[i, j, k]
-
ตอบ :=เท็จ
-
ถ้า j> 0 และ k>=0 และ s2[j] =s3[k] แล้ว
-
ans :=แก้ (s1, s2, s3, dp, i – 1, j, k – 1)
-
-
ถ้า j> 0 และ k>=0 และ s2[j] =s3[k] แล้ว
-
ans :=ans OR แก้ (s1, s2, s3, dp, i, j – 1, k – 1)
-
-
set 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
-
ผลตอบแทนการแก้ (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