2011-04-30 47 views
1

我已经看到了其他递归回文问题,我已经看到了答案,但我有一个不同的答案。它需要能够用空格和标点符号来检查字符串并忽略它们(我知道,它们在技术上不是回文),所以诸如“女士,我是亚当”这样的字符串应该返回true,但我的程序不是。下面是我有:在Java中需要回文递归方法的帮助

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。我不知道该怎么做。我一直在尝试不同的解决方案,现在一个小时左右。

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

+0

为什么使用递归(这是不是高性能的),当你凑LD从双方,从四肢到中心穿过弦的边界? – 2011-04-30 02:11:43

回答

4

你不回前两个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)); 
    } 
+0

哇....我不相信我错过了。谢谢! – Wonger 2011-04-30 02:24:42

0

当你到了一个,你只需要与前进它。像这样。我让你来填补空白(特殊情况下,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); 
} 
0

,根据或者在最坏情况下为O(n/2)之上的非递归方法(全搜索) 。这是更好的性能,当字符串是一个漫长的......这里的执行...

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