【问题标题】:Efficient way to determine whether an input string is a palindrome or not确定输入字符串是否为回文的有效方法
【发布时间】:2018-12-24 00:39:43
【问题描述】:

我最近编写了这个简短的方法来确定一个字符串是否是回文。我想知道我可以做些什么来提高它的效率,我肯定缺少可以加快计算速度的简单内置函数。

感谢大家的帮助!

boolean checkPalindrome(String inputString) {

    ArrayList<Character> arrFront = new ArrayList<Character>();
    ArrayList<Character> arrBack = new ArrayList<Character>();

    for(int i=0; i<inputString.length()-1; i++) {
        arrFront.add(inputString.charAt(i));
    }

    for(int i=inputString.length()-1; i>0; i--) {
        arrBack.add(inputString.charAt(i));
    }

    StringBuilder builder1 = new StringBuilder(arrFront.size());
    for (Character c : arrFront) {
        builder1.append(c);
    }
    String front = builder1.toString();

    StringBuilder builder2 = new StringBuilder(arrBack.size());
    for (Character c : arrBack) {
        builder2.append(c);
    }
    String back = builder2.toString();

    return(front.equals(back));
}

【问题讨论】:

  • speed up 是什么意思?时间复杂度,还是更少的代码?
  • 你的意思是像this?请注意,这是更少的代码,而是not very efficient
  • 我投票结束这个问题,因为它属于 Code Review SE。
  • @AndreyTyukin 是的,如果您关心效率,简单的循环解决方案 (for (int i = 0; i &lt; n/2; ++i) { if (str.charAt(i) != str.charAt(n-i-1)) return false; }) 是更好的选择
  • @GBlodgett 使用str.length() 也会加快速度!早点回来会安全一段时间。

标签: java string optimization palindrome


【解决方案1】:

就效率而言,并不总是与内置函数和使用库有关(尽管在许多情况下它们是最佳选择)。但有时像这样的简单循环可能是最简单有效的方法:

private boolean checkPalindrome(String inputString) {
    for(int i = 0, j = inputString.length() - 1; i < j; i++, j--) {
        if(inputString.charAt(i) != inputString.charAt(j)) {
            return false;
        }
    }
    return true;
}

【讨论】:

    【解决方案2】:

    可以参考@FernandoPelliccioni 文章Check string for palindrome。他对这个解决方案进行了非常彻底的分析。

    对于简单的解决方案:

    public static boolean isPalindrome(String str) {
        return str.equals(new StringBuilder(str).reverse().toString());
    }
    

    在效率方面:

    public static boolean isPalindrome(String str) {
        int n = str.length();
        for (int i = 0; i < n/2; ++i) {
           if (str.charAt(i) != str.charAt(n-i-1)) return false;
        }
        return true; 
    }
    

    【讨论】:

      【解决方案3】:

      我认为最简单的方法是使用默认的StringBuilder
      这个类有一个很好的功能,可能很有用。 它被称为reverse()。它按照它所说的去做,它反转了被解析为StringBuilder 的字符串。有了这个,很容易检查给定的字符串是否等于反转。

      例如你可以这样做:

      public boolean isPallindrome(String input){
          StringBuilder reversed = new StringBuilder(input);
          reversed.reverse();
          /*
           * Just replace equals with equalsIgnoreCase
           * to ignore the case
           */
          return(reversed.toString().equalsIgnoreCase(input));
      }
      

      给定的代码只是创建一个StringBuilder 实例并直接附加输入。 然后它反转 StringBuilder 并检查输入是否等于反转的字符串。

      【讨论】:

        【解决方案4】:

        这是一个更简单的方法。

        public boolean checkPalindrome(String str) {
            int len = inputString.length()/2;
            for(int i = 0 ; i < len ; i++) {
                if(str.charAt(i) != str.charAt(str.length()-1-i)) {
                    return false;
                }
            }
            return true;
        }
        

        当str的长度为N时。时间复杂度为O(N/2)。 注意:str 的长度为奇数时不需要检查中间字符,因为它是它本身。

        例如,

        ssstsss,你不需要检查t

        因为len 是整数。无法表达decimal part。它会自动下降。 lenssstsss3 因为它是 7/2 = 3.5 和下降 0.5

        即使它的长度是偶数,它也会起作用。例如,abccba。长度为6。而len3。当长度为偶数时,必须检查中间的两个字符,即cc

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-18
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          相关资源
          最近更新 更多