在Java中使用字符串的回文

问题描述 投票:-1回答:3

我正在尝试创建一个名为“ palindrome”的方法,该方法接收一个String,如果String是Palindrome,则返回布尔值true,否则返回false。如果单词前后读相同,则表示回文。例如,单词level是回文。

例如,以回文为例,考虑通过删除所有空格和标点符号并将所有字母转换为小写形式而获得的文本:

女士,我是亚当==> madamimadam

[人,计划,运河:巴拿马==> amanaplanacanalpanama

我试图处理我使用replaceAll();的代码,并输出为替换所有内容的最后一行。

public static String palindrome(String n){

      char[] input = n.toCharArray();

    //for(int i=0; i<input.length; i++){ //looping reversing using input as in length minus 1 from end to start and counting using increment
      n.toLowerCase();
      String noSpaces = n.replaceAll(" ", ""); //I used this to get string 
      String remove = noSpaces.replaceAll(",","");
      String remove2 = remove.replaceAll(".","");
      String remove3 = remove2.replaceAll(":","");
      String remove4 = remove3.replaceAll("!", "");
      System.out.print(remove4);    
      //return n;  
    //}
    return n;
    }

编译器/输出:

Input: Madam, I'm Adam

Output:

输出未显示任何内容?我究竟做错了什么?

我正在尝试创建一个名为“ palindrome”的方法,该方法接收一个String,如果String是Palindrome,则返回布尔值true,否则返回false。如果单词读为...,则为回文,] ...] >>

问题是,点实际上匹配任意字符多次。因此,如果您输入remove.replaceAll(".",""),所有字符将被替换为空。您应该对点进行转义以指定实际的点。希望这会有所帮助。

n = n.toLowerCase();//you should assign the result to get lowercase characters
String noSpaces = n.replaceAll(" ", ""); //I used this to get string 
String remove = noSpaces.replaceAll(",","");
String remove2 = remove.replaceAll("\\.","");
String remove3 = remove2.replaceAll(":","");
String remove4 = remove3.replaceAll("!", "");
String remove5 = remove2.replaceAll("\'","");//you should also escape apostrophe
System.out.print(remove5);

Java replaceAll()的第一个参数是regex。正则表达式中的.匹配任何字符,因此remove.replaceAll(".", "")有效地为您提供了一个空字符串。

转义句号,您应该再次得到一个字符串。

String remove2 = remove.replaceAll("\\.","");

要删除所有特殊字符,您只需使用remove.replaceAll("\\p{Punct}", "")

此外,您也可以通过链接“删除”来简化代码,如下所示:

String output = n.toLowerCase().replaceAll(" ", "").replaceAll("\\p{Punct}", "");
System.out.println(output);

现在,它本身不会返回回文,也不会对其进行检查。要检查回文,您必须创建一个方法,该方法将指针放在字符串的头尾两端,并比较两个索引处的字符是否匹配。您将分别增加和减少这些指针,直到:

  1. 字符不相同,或
  2. 尾指针的值小于头指针的值。

    例如:

  3. boolean isPalindrome(String word) {
        int headPtr = 0;
        int tailPtr = word.length() -1 ;
    
        while (headPtr < tailPtr) {
            if (word.charAt(headPtr) != word.charAt(tailPtr))
                return false;
            headPtr++;
            tailPtr--;
        }
        return true;
    }
    

    您可以使用偶数和奇数编号的字符串进行测试,以确保中断条件正确。例如otto,hannah,1234321,甚至您的长短语。完成的实现应如下所示:

String output = n.toLowerCase().replaceAll(" ", "").replaceAll("\\p{Punct}", "");
System.out.println(output + " is palindrome? " + isPalindrome(output));
java bluej replaceall
3个回答
0
投票

问题是,点实际上匹配任意字符多次。因此,如果您输入remove.replaceAll(".",""),所有字符将被替换为空。您应该对点进行转义以指定实际的点。希望这会有所帮助。


0
投票

Java replaceAll()的第一个参数是regex。正则表达式中的.匹配任何字符,因此remove.replaceAll(".", "")有效地为您提供了一个空字符串。

转义句号,您应该再次得到一个字符串。


0
投票

要删除所有特殊字符,您只需使用remove.replaceAll("\\p{Punct}", "")

此外,您也可以通过链接“删除”来简化代码,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.