代码求优化解决方案
代码求优化
这段代码是用来计算最长公共子串的。使用了后缀数组的算法。
Java不像C++那样拥有指针。所以我只能将这些后缀数组用substring提取出来,然后复制,这样效率很低。另外我对Java不熟悉。请高手帮助优化下。谢谢。
分数不是问题。只要有人给出阶段性成果,我就再发帖继续提问。
------解决方案--------------------
http://blog.sina.com.cn/s/blog_9707fac3010178xm.html
------解决方案--------------------
你的代码从Java语言本身的角度来说完全是可以的。
如果要优化,我觉得只能从算法复杂度上去优化了。
我个人算法不行,但是我知道动态规划效率应该算比较好的。
参见:http://www.cnblogs.com/7hat/p/3422697.html
------解决方案--------------------
针对你这个思路 可以吧((sa[i].endsWith("#") ? 1 : 0) + (sa[i - 1].endsWith("#") ? 1 : 0) == 1)) if中的验证防抖最后一个for循环最上面。先判断是不是在一个字符串中,再作比较,应该会好点。
import java.util.Arrays;
public class Program {
public static void main(String[] args) {
String s1 = "acdefgv";
String s2 = "cdefabgva";
System.out.println(LCS(s1, s2));
}
public static String LCS(String s1, String s2)
{
int len1 = s1.length();
int len2 = s2.length();
String[] sa = new String[len1 + len2];
for (int i = 0; i < len1; i++)
sa[i] = s1.substring(i, len1) + "#";
for (int i = 0; i < len2; i++)
sa[len1 + i] = s2.substring(i, len2);
Arrays.sort(sa);
int max = 0;
int maxindex = 0;
for (int i = 1; i < sa.length - 1; i++)
{
int n = 0;
for (int j = 0;
j < (sa[i].length() > sa[i - 1].length() ?
sa[i - 1].length() :
sa[i].length());
j++)
{
if (!sa[i].substring(j, j + 1)
.equals(sa[i - 1].substring(j, j + 1)))
break;
n++;
}
if (n > max &&
((sa[i].endsWith("#") ? 1 : 0) +
(sa[i - 1].endsWith("#") ? 1 : 0) == 1))
{
max = n;
maxindex = i;
}
}
if (max == 0) return ""; else return sa[maxindex].substring(0, max);
}
}
这段代码是用来计算最长公共子串的。使用了后缀数组的算法。
Java不像C++那样拥有指针。所以我只能将这些后缀数组用substring提取出来,然后复制,这样效率很低。另外我对Java不熟悉。请高手帮助优化下。谢谢。
分数不是问题。只要有人给出阶段性成果,我就再发帖继续提问。
------解决方案--------------------
http://blog.sina.com.cn/s/blog_9707fac3010178xm.html
------解决方案--------------------
你的代码从Java语言本身的角度来说完全是可以的。
如果要优化,我觉得只能从算法复杂度上去优化了。
我个人算法不行,但是我知道动态规划效率应该算比较好的。
参见:http://www.cnblogs.com/7hat/p/3422697.html
------解决方案--------------------
针对你这个思路 可以吧((sa[i].endsWith("#") ? 1 : 0) + (sa[i - 1].endsWith("#") ? 1 : 0) == 1)) if中的验证防抖最后一个for循环最上面。先判断是不是在一个字符串中,再作比较,应该会好点。