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