回文方法逻辑错误

时间:2018-04-14 17:44:38

标签: java

我正在编写一种方法,当传递一个字符串时,如果它是回文,则返回'true',如果不是回文,则返回'false'。返回回文时,该方法忽略任何标点符号和空格。当我尝试传递字符串“Hannah”时,它返回false。

public static boolean isPalindrome(String p){
  String backwardsOriginal = "";
  String blank = "";
  for(int i =0; i< p.length();i++){
     String lookAt = p.substring(i,i+1).toLowerCase();
     if ((!lookAt.equals(" ")) || (!lookAt.equals(",")) || (!lookAt.equals(".")) || (!lookAt.equals("!")) ||(!lookAt.equals("?"))) {
        blank+=lookAt.toLowerCase();
     }

  }
     for(int j=blank.length();j>=0;j--){
        if(j==0)
           backwardsOriginal +=blank.substring(0,j+1).toLowerCase();
        else
           backwardsOriginal += blank.substring(j-1,j).toLowerCase();
     }
        boolean k = true;
        int first = 0;
        int last = blank.length()-1;
        int ct = 0;
        while(k && (ct != blank.length())){
           if (last == 0) {
              if (blank.substring(blank.length()-1) != backwardsOriginal.substring(0,blank.length())) {
                 k=false;
              }
           } else if (last > 0) {
              if(blank.substring(first, first+1).equals(backwardsOriginal.substring(last-1,last))) {
                 k=true;
                 first++;
                 last--;
              } else {
                 k=false;
              }
           }
        }
        return k;  
     }

1 个答案:

答案 0 :(得分:1)

我会从正则表达式开始,将所有内容转换为单词字符(这是一个特殊的类正则表达式\W,单词为\w - 而在Java中,我们必须转义{{ 1}}用于模式)。然后,我会小写并将结果转换为\。然后,你只需要迭代数组长度的一半 - 如果任何字符都没有在正确的位置char[] - 如果你到达最后它是一个回文。像,

return false

我用

进行了测试
public static boolean isPalindrome(String p) {
    char[] arr = p.replaceAll("\\W", "").toLowerCase().toCharArray();
    int len = arr.length;
    for (int i = 0; i < len / 2; i++) {
        if (arr[i] != arr[len - i - 1]) {
            return false;
        }
    }
    return true;
}

(它是System.out.println(isPalindrome("A Man, a Plan, a Canal Panama!")); )。并且,根据您在评论中更新的限制,您可以使用true实现相同的算法(但您需要两个循环,一个用于构建&#34;正确&#34; StringBuilder - 另外测试它是否是回文)。像,

String