Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 有三个或四个字符串的交错字符串_String_Algorithm_Dynamic Programming - Fatal编程技术网

String 有三个或四个字符串的交错字符串

String 有三个或四个字符串的交错字符串,string,algorithm,dynamic-programming,String,Algorithm,Dynamic Programming,我已经使用动态规划(使用2D矩阵)实现了2个字符串的交错字符串问题,现在我想对3或4个字符串执行相同的操作。我不知道如何操作索引。有人能帮我用3D或4D矩阵吗 例如:s1=one,s2=simple,s3=example,res=onsimexeplesample->TRUE 更新**交错字符串问题:给定三个字符串A、B和C。如果C包含A和B的所有字符,并且保留了单个字符串中所有字符的顺序,则C称为交错A和B 两个字符串的实现: 公共类解决方案{ 公共布尔ISinterleve(字符串s1、字符

我已经使用动态规划(使用2D矩阵)实现了2个字符串的交错字符串问题,现在我想对3或4个字符串执行相同的操作。我不知道如何操作索引。有人能帮我用3D或4D矩阵吗

例如:s1=one,s2=simple,s3=example,res=onsimexeplesample->TRUE

更新**交错字符串问题:给定三个字符串A、B和C。如果C包含A和B的所有字符,并且保留了单个字符串中所有字符的顺序,则C称为交错A和B

两个字符串的实现

公共类解决方案{
公共布尔ISinterleve(字符串s1、字符串s2、字符串s3){
如果(s3.length()!=s1.length()+s2.length()){
返回false;
}
布尔dp[][]=新布尔值[s1.length()+1][s2.length()+1];

对于(int i=0;i好的,这是我的Java实现,用于三个具有3D矩阵记忆的字符串:

public class Solution {
    public boolean isInterleaving(int i, int j, int k, String s1, String s2, String s3, String S,
            boolean dp[][][], boolean visited[][][]) {

        if (i == s1.length() && j == s2.length() && k == s3.length()) {
            return true;
        }

        if(visited[i][j][k]) {
            return dp[i][j][k];
        }

        visited[i][j][k] = true;
        if (i < s1.length() && s1.charAt(i) == S.charAt(i + j + k)) {
            if (isInterleaving(i + 1, j, k, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        if (j < s2.length() && s2.charAt(j) == S.charAt(i + j + k)) {
            if (isInterleaving(i, j + 1, k, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        if (k < s3.length() && s3.charAt(k) == S.charAt(i + j + k)) {
            if (isInterleaving(i, j, k + 1, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        return dp[i][j][k] = false;
    }

    public boolean isInterleave(String s1, String s2, String s3, String S) {
        if (S.length() != s1.length() + s2.length() + s3.length()) {
            return false;
        }
        boolean dp[][][] = new boolean[s1.length() + 1][s2.length() + 1][s3.length() + 1];
        boolean visited[][][] = new boolean[s1.length() + 1][s2.length() + 1][s3.length() + 1];

        return isInterleaving(0, 0, 0, s1, s2, s3, S, dp, visited);
    }
}
公共类解决方案{
公共布尔isInterleaving(整数i、整数j、整数k、字符串s1、字符串s2、字符串s3、字符串S、,
布尔dp[][],布尔访问[][]{
如果(i==s1.length()&&j==s2.length()&&k==s3.length()){
返回true;
}
如果(访问[i][j][k]){
返回dp[i][j][k];
}
访问[i][j][k]=真实;
如果(i

希望有帮助!如果你不理解任何部分,我会做一些解释:)

你没有描述什么是交错字符串问题,也没有展示你在两个字符串上的工作。雪人认为这是不可能的。我能想到O(n^3)和O(n^4)三个字符串和四个字符串的解决方案。@KaidulIslam,我的错。我想到了3D或4D矩阵。@MBo,我已经编辑了我的问题。@agoodguy所以使用3D和4D矩阵可以吗?哦,太好了。非常感谢。我会自己处理三个字符串。对不起,我点击了错误的按钮。无论如何,这不起作用。@agoodguy嗨,我很高兴rry的错误解决方案。检查更新现在,我已经写了正确的解决方案,现在修改您的Java之一。
public class Solution {
    public boolean isInterleaving(int i, int j, int k, String s1, String s2, String s3, String S,
            boolean dp[][][], boolean visited[][][]) {

        if (i == s1.length() && j == s2.length() && k == s3.length()) {
            return true;
        }

        if(visited[i][j][k]) {
            return dp[i][j][k];
        }

        visited[i][j][k] = true;
        if (i < s1.length() && s1.charAt(i) == S.charAt(i + j + k)) {
            if (isInterleaving(i + 1, j, k, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        if (j < s2.length() && s2.charAt(j) == S.charAt(i + j + k)) {
            if (isInterleaving(i, j + 1, k, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        if (k < s3.length() && s3.charAt(k) == S.charAt(i + j + k)) {
            if (isInterleaving(i, j, k + 1, s1, s2, s3, S, dp, visited)) {
                return dp[i][j][k] = true;
            }
        }

        return dp[i][j][k] = false;
    }

    public boolean isInterleave(String s1, String s2, String s3, String S) {
        if (S.length() != s1.length() + s2.length() + s3.length()) {
            return false;
        }
        boolean dp[][][] = new boolean[s1.length() + 1][s2.length() + 1][s3.length() + 1];
        boolean visited[][][] = new boolean[s1.length() + 1][s2.length() + 1][s3.length() + 1];

        return isInterleaving(0, 0, 0, s1, s2, s3, S, dp, visited);
    }
}