Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 3个字符串输入中最长的公共子字符串_String_Algorithm_Substring - Fatal编程技术网

String 3个字符串输入中最长的公共子字符串

String 3个字符串输入中最长的公共子字符串,string,algorithm,substring,String,Algorithm,Substring,我做这个问题是为了我自己的实践,不确定我是否以最有效的方式来做。请分享任何关于提高效率和我的算法的想法 我的算法: 为每个对应的字符串创建三个后缀数组。 创建后缀数组:一个循环遍历字符串,然后使用stl库对向量进行排序,所以我相信字符串的预处理是在*nlogn上进行的。我应该如何降低这里的复杂性? 然后遍历任何向量,比较所有三个输入字符串的后缀字符串,并与您得到的最大值进行比较。 代码: 字符串commonLongestSubstringstring str1、字符串str2、字符串str3 {

我做这个问题是为了我自己的实践,不确定我是否以最有效的方式来做。请分享任何关于提高效率和我的算法的想法

我的算法:

为每个对应的字符串创建三个后缀数组。 创建后缀数组:一个循环遍历字符串,然后使用stl库对向量进行排序,所以我相信字符串的预处理是在*nlogn上进行的。我应该如何降低这里的复杂性? 然后遍历任何向量,比较所有三个输入字符串的后缀字符串,并与您得到的最大值进行比较。 代码:

字符串commonLongestSubstringstring str1、字符串str2、字符串str3 { int length1=str1.length,length2=str2.length,length3=str3.length; 如果长度1==0 | |长度2==0 | |长度3==0 回来 向量suffixArray1=getSuffixArraystr1; 向量suffixArray2=getSuffixArraystr2; 向量suffixArray3=getSuffixArraystr3; 字符串longestcomon=; 对于int i=0;i 如何降低预处理后缀数组的部分的复杂性? 这是针对三个字符串的,但如果问题大小增加到n个字符串,那么这个算法将不起作用,因为我必须创建n个后缀数组。那么我们通常如何处理这种情况呢? 关于我们通常如何解决这类问题的一般想法?
语言无障碍

你可以用a来求解

给三个字符串a,b,c这样的算法可以用olengha*lengthb*lengthc来求解

可以使用dinamic编程重写以下算法以提高性能,但这是一个很好的起点:

public static void main(final String[] args) {
    System.out.println(lcs("hello", "othello", "helicopter"));
}

private static String lcs(final String a, final String b, final String c) {
    return recursive_lcs(a, b, c, "");
}

private static String recursive_lcs(final String a, final String b,
        final String c, String res) {
    // Base case: one of the string is empty
    if ((a.length() == 0) || (b.length() == 0) || (c.length() == 0)) {
        return res;
    }
    // Recursive case: find one common character
    else if ((a.charAt(0) == b.charAt(0)) && (b.charAt(0) == c.charAt(0))) {
        res += a.charAt(0);
        // Go to the next character
        final String r1 = recursive_lcs(a.substring(1), b.substring(1),
                c.substring(1), res);
        // Search if exists a longer sequence
        final String r2 = findMax(a, b, c, "");

        if (r2.length() > r1.length()) {
            return r2;
        } else {
            return r1;
        }
    }
    // Recursive case: no common character.
    else {
        // Check if is better the computed sequence, or if exists one better
        // forward
        final String c1 = findMax(a, b, c, "");
        if (c1.length() > res.length()) {
            return c1;
        } else {
            return res;
        }
    }
}

private static String findMax(final String a, final String b,
        final String c, final String res) {
    // Check all the possible combinations
    final String c1 = recursive_lcs(a, b, c.substring(1), res);
    final String c2 = recursive_lcs(a, b.substring(1), c, res);
    final String c3 = recursive_lcs(a.substring(1), b, c, res);
    if (c1.length() > c2.length()) {
        if (c1.length() > c3.length()) {
            return c1;
        } else {
            return c3;
        }
    } else {
        if (c2.length() > c3.length()) {
            return c2;
        } else {
            return c3;
        }
    }
}
输出:

hel

看起来有一个专门的wikipedia页面,其中有一个算法部分和伪代码,这应该有助于解决复杂性问题: