如何提高此代码的性能,减少编译时间并保持代码功能相同?
代码是从不同的字符串中提取两个子字符串并将它们连接起来,以提供最大可能的回文字符串。
问题是:你有两个字符串,(a)和(b)。找到一个字符串,(c),这样:(c)=(d)+(e)。
(d),(e)可以表示为(d)是(a)的非空子串,(e)是(b)的非空子串。 (c)是回文字符串。 长度尽可能长。 对于作为输入接收的每对字符串(a)和(b),在新行上查找并打印字符串。如果您能够形成多个有效字符串,请按字母顺序打印最先出的字符串。如果没有有效答案,请改为打印-1。
import java.io.*;
import java.util.*;
public class Solution {
boolean isPalindrome(String s) {
int n = s.length();
for (int i=0;i<(n / 2);++i) {
if (s.charAt(i) != s.charAt(n - i - 1)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String result="";
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int a=0; a<n; a++)
{int length1, length2, i,c,d,j;
int max_length=0;
String string1 = in.next();
String sub1,sub2;
String string2 = in.next();
length2=string2.length();
length1 = string1.length();
for( c = 0 ; c <length1 ; c++ )
{
for( i = length1-c ; i >0 ; i-- )
{
sub1 = string1.substring(c, c+i);
for( d = 0 ; d < length2 ; d++ )
{
for( j = length2-d ; j >0 ; j-- )
{
sub2 = string2.substring(d, d+j);
String temp=sub1+sub2;
Solution obj= new Solution();
if(temp.length()>=max_length && obj.isPalindrome(temp)==true)
{
if (max_length==temp.length())
{ if(temp.compareTo(result)<0)
{
result=temp;
}}
else {
max_length=temp.length();
result=temp;
}
}
}
}
}
}
if(max_length==0)
System.out.println(-1);
else
{
System.out.println(result);
result="";
}
} /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
}
}
答案 0 :(得分:0)
我假设您希望减少执行时间,而不是编译时间。 最好避免猜测,而是确定完全如何花费时间。 This就是一个很好的例子。 如果你有猜测,这将证明它,或通过向你展示真正的问题来反驳它。
我有猜测(这只是猜测)。 你有一个三级嵌套循环,在最里面的循环中,我看到一堆看起来很可疑的东西。
最大的一个是new Solution()
。
这会打击内存管理器,这可能是非常昂贵的,不仅要制作对象,还要清理它们。
也许你可以将其移出内循环。
之后出现String temp=sub1+sub2;
,它也会命中内存管理器创建一个新字符串。
也许你可以使用字符串构建器。
之后isPalindrome
。
无论这是否有效,我都不知道。
最后,您的代码需要更加严格的缩进。 仅凭这一点就可能导致各种错误,因为无法遵循您正在做的事情。