【问题标题】:Need help with palindrome recurse method in Java在 Java 中需要回文递归方法的帮助
【发布时间】:2011-04-30 02:07:20
【问题描述】:

我看过其他递归回文问题,也看过答案,但我的答案有点不同。它需要能够检查带有空格和标点符号的字符串并忽略它们(我知道,它们在技术上不是回文),因此诸如“女士,我是亚当”之类的字符串应该返回 true,但我的程序不是。这是我所拥有的:

public static boolean isPalindrom(String s){
        System.out.println(s);
        if (!Character.isLetter(s.charAt(0))){
            isPalindrom(s.substring(1,s.length()));
        }
         if (!Character.isLetter(s.charAt(s.length()-1))){
            isPalindrom(s.substring(0,s.length()-1));
        }
         if (s.length() == 1){

            return true;
        }
         if (s.length() == 2){
            if (s.substring(0,1).equalsIgnoreCase(s.substring(s.length()-1))){

                return true;
            }
            else
                return false;
        }
        if (!(s.substring(0,1).equalsIgnoreCase(s.substring(s.length()-1)))){

            return false;
        }

            return isPalindrom(s.substring(1,s.length()-1));

    }

问题在于,一旦开始展开递归,包含空格和标点符号的字符串就会开始返回 false。我不知道该怎么办。大约一个小时以来,我一直在尝试不同的解决方案。

附言我试图不使用正则表达式来删除空格和标点符号等。

【问题讨论】:

  • 当您可以从两侧(从末端到中心)浏览字符串的边界时,为什么要使用递归(这不是高性能)?

标签: java


【解决方案1】:

您不会返回前两个 isPalindrom 的结果(检查现在开始失败的案例...):

  if (!Character.isLetter(s.charAt(0))){
        return isPalindrom(s.substring(1,s.length()));
    }
     if (!Character.isLetter(s.charAt(s.length()-1))){
        return isPalindrom(s.substring(0,s.length()-1));
    }

【讨论】:

    【解决方案2】:

    当你达到一个时,你只需要继续前进。像这样。我留给你填空(特殊情况,lastNonIgnoredChar 等)

    char[] ignored = new char[] { ',' , ' ', '.'};
    
    int firstNonIgnoredChar(String s) {
        for(int i = 0; i < s.length(); i++) {
            boolean found = false;
            for(char c : ignored) {
                if( c == s.charAt(i) ) found = true;
            }
            if(!found) return i;
        }
        return -1; // no good characters
    }
    
    boolean isPal(String s) {
        int first = firstNonIgnoredChar(s);
        int last = lastNonIngoredChar(s);
    
        if(s.length() == 0) return true;
        if(s.length() == 1) return true;
    
        return first < last
            && s.charAt(first) == s.charAt(last)
            && isPal(s.substring(first + 1, last - 1);
    }
    

    【讨论】:

      【解决方案3】:

      一种非递归方法,在最坏情况下(完全搜索)下或在 O(n/2) 处运行。当 String 为 LONG 时,这会更高效...这是实现...

      class PalindromeClass {
      
          /**
           * This method will run under or at O(n/2) with n = sentence.size()
           * @param sentence is a given String sentence.
           * @return true if the given sentence is a palindrome.
           */
          public static boolean isPalindrome(String sentence) {
              sentence = sentence.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
              char[] sentenceChars = sentence.toCharArray();
              for (int i = 0; i < sentenceChars.length / 2; i++) {
                  if (sentenceChars[i] != sentenceChars[sentenceChars.length - 1 - i]) {
                      return false;
                  }
              }
              return true;
          }
      

      用短、长和错误的参数运行它会给你正确的值...

      public static void main(String[] args) {
      
      String wrong = "ABCA";
      System.out.println("Is '" + wrong + "' a palindrome? ");
      System.out.println(isPalindrome(wrong));
      
      String none = "A'";
      System.out.println("Is '" + none + "' a palindrome? ");
      System.out.print(isPalindrome(none));
      
      String a = "Madam, I'm Adam";
      System.out.println("Is '" + a + "' a palindrome? ");
      System.out.println(isPalindrome(a));
      
      String b = "abba";
      System.out.println("Is '" + b + "' a palindrome? ");
      System.out.println(isPalindrome(b));
      
      String toyota = "A Toyota. Race fast, safe car. A Toyota.";
      System.out.println("Is '" + toyota + "' a palindrome? ");
      System.out.println(isPalindrome(toyota));
      
      String longestPalindrome = "Do good? I? No! Evil anon I deliver. I maim " +
          "nine more hero-men in Saginaw, sanitary sword a-tuck, Carol, I -- lo! " +
          "-- rack, cut a drowsy rat in Aswan. I gas nine more hero-men in Miami. " +
          "Reviled, I (Nona) live on. I do, O God!";
      System.out.println("Is '" + longestPalindrome + "' a palindrome? ");
      System.out.println(isPalindrome(longestPalindrome));
      }
      

      }

      这是执行的输出......

      Is 'ABCA' a palindrome? false
      Is 'a' a palindrome? true
      Is 'Madam, I'm Adam a palindrome?' true
      Is 'abba a palindrome? true'
      Is 'A Toyota. Race fast, safe car. A Toyota.' a palindrome? true
      Is 'Do good? I? No! Evil anon I deliver. I maim nine more hero-men in Saginaw, sanitary sword a-tuck, Carol, I -- lo! -- rack, cut a drowsy rat in Aswan. I gas nine more hero-men in Miami. Reviled, I (Nona) live on. I do, O God!' a palindrome? true
      

      【讨论】:

        猜你喜欢
        • 2012-04-29
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 2011-05-31
        • 1970-01-01
        • 2011-08-17
        相关资源
        最近更新 更多