给定代码的时间限制必须少于1.824秒。在给定代码以下的时间超过此限制。我可以添加或替换哪些内容,以使代码得到优化并在该时间限制内运行。 下面的代码通过删除字符串中的'spaces'和特殊字符来检查给定的字符串是否为pallindrome。在删除特殊字符后,字符串mus仅保留字母。 示例: 输入: 2 我是:铁我马,我 Ab / Ba 输出: 是 是的
代码:
public static void main (String[] args) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int T=Integer.parseInt(br.readLine());
while(T-->0)
{
String frog=br.readLine().replaceAll("\\s+","").replaceAll("[^\\w]","");
String news="";
char ch;
for(int i=0;i<frog.length();i++)
{
ch=frog.charAt(i);
news=ch+news;
}
if(news.equalsIgnoreCase(frog))
System.out.println("YES");
else
System.out.println("NO");
}
}
}
答案 0 :(得分:4)
这似乎是一项家庭作业,所以我不会为您提供代码,我只会指导您如何改进方法。
您的方法是线性的,您反转字符串,然后将反转与原始字符串进行比较。尽管这是一种正确的方法,但您需要进行过多的操作。
假定字符串的长度为N,另一种方法是简单地循环N / 2次,并且每次将第i个字符与第N个第i个字符进行比较。如果有任何字符不匹配,请打印“否”并中断,否则继续进行比较。如果所有字符都匹配,则打印是。
Mead的解决方案与您的解决方案几乎相同,尽管它减少了最初的过滤操作。
答案 1 :(得分:0)
使用单个正则表达式代替两个正则表达式,因此不必做2个replaceAll()和一个StringBuilder,因为每个串联都创建一个新的String(字符串是不可变的)
public static final void main (final String[] args) throws IOException
{
final BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int T=Integer.parseInt(br.readLine());
final StringBuilder sb = new StringBuilder();
String frog;
while(T-->0)
{
frog = br.readLine().replaceAll("\\s+|[^\\w]","");
for(int i=frog.length()-1;i!=-1;i++)
{
sb.append(frog.charAt(i));
}
if(sb.toString().equalsIgnoreCase(frog))
System.out.println("YES");
else
System.out.println("NO");
sb.setLength(0);
}
}