确定字符串是否为回文的最快方法

时间:2014-01-28 11:01:14

标签: java performance palindrome

我需要一种能够以最快的执行时间验证的算法,如果字符串是回文(字符串可以是带有大写或小写字母,空格等的命题)。所有这些都在Java中。我得到了一个样本:

bool isPalindrome(string s) {
    int n = s.length();
    s = s.toLowerCase();
    for (int i = 0; i < (n / 2) + 1; ++i) {
        if (s.charAt(i) != s.charAt(n - i - 1)) {
            return false;
        }
    }
    return true;
}

我使用.toLowerCase()函数将字符串转换为小写字母,但我不知道它会影响执行时间。

而且我也不知道如何以有效的方式解决标点符号和单词之间的空格问题。

7 个答案:

答案 0 :(得分:8)

我认为您只需检查字符串 反向 ,不是吗?

StringBuilder sb = new StringBuilder(str);
return str.equals(sb.reverse().toString());

或者,对于早于JDK 1.5的版本:

StringBuffer sb = new StringBuffer(str);
return str.equals(sb.reverse().toString());

答案 1 :(得分:3)

这可以避免任何复制。函数isBlanktoLowerCase在您的问题中未指定,因此请按照您想要的方式定义它们。举个例子:

boolean isBlank(char c) {
    return c == ' ' || c == ',';
}

char toLowerCase(char c) {
    return Character.toLowerCase(c);
}

不要担心方法调用的成本,这是JVM擅长的。

for (int i = 0, j = s.length() - 1; i < j; ++i, --j) {
    while (isBlank(s.charAt(i))) {
        i++;
        if (i >= j) return true;
    }
    while (isBlank(s.charAt(j))) {
        j--;
        if (i >= j) return true;
    }
    if (toLowerCase(s.charAt(i)) != toLowerCase(s.charAt(j))) return false;
}
return true;

尝试对此进行基准测试......我希望mu解决方案可能是最快的,但没有测量你永远不会知道。

答案 2 :(得分:2)

在有效性方面,您的解决方案似乎很好。

关于你的第二个问题,你可以在开始测试之前删除所有的空格和点等:

String stripped = s.toLowerCase().replaceAll("[\\s.,]", "");
int n = stripped.length();
for (int i = 0; i < (n / 2) + 1; ++i) {
    if (stripped.charAt(i) != stripped.charAt(n - i - 1)) {
...

答案 3 :(得分:1)

有效与效率不同。

只要您考虑空格,特殊字符等,您的答案就会有效。甚至口音也可能有问题。

关于效率,toLowerCase是O(n),任何正则表达式解析也是O(n)。如果您对此感到担忧,那么转换和比较char by char应该是最好的选择。

答案 4 :(得分:0)

在正常情况下:

 StringBuilder sb = new StringBuilder(myString);
 String newString=sb.reverse().toString();
 return myString.equalsIgnoreCase(newString); 

如果使用区分大小写:

StringBuilder sb = new StringBuilder(myString);
String newString=sb.reverse().toString();
return myString.equals(newString); 

答案 5 :(得分:0)

以下是我使用Java检测回文的方法。随意提问:)希望我能以某种方式提供帮助....

import java.util.Scanner;
public class Palindrome  {
   public static void main(String[]args){
      if(isReverse()){System.out.println("This is a palindrome.");}
      else{System.out.print("This is not a palindrome");}
   }
   public static boolean isReverse(){
     Scanner keyboard =  new Scanner(System.in);
      System.out.print("Please type something: "); 
      String line = ((keyboard.nextLine()).toLowerCase()).replaceAll("\\W","");
      return (line.equals(new StringBuffer(line).reverse().toString()));
   }
}

答案 6 :(得分:0)

这是我的尝试:

new_date= Put( orig_date , mmddyys10.);