Java 检查句子前后是否有相同的单词

Java 检查句子前后是否有相同的单词,java,palindrome,Java,Palindrome,我试图检查一个句子是前后相同还是“句子回文”。句子“你可以关一只燕子,不是吗,但你不能关一只燕子,不是吗?”应该作为回文返回(真)。忽略所有不是字母的东西 我的问题是:不知道如何具体比较单词。这目前适用于检查单词是否为回文,但我需要找出要更改什么来比较每个单词 public static boolean isWordPalindrome(String input) { Deque<Character> q = new LinkedList<>( ); Deque&

我试图检查一个句子是前后相同还是“句子回文”。句子“你可以关一只燕子,不是吗,但你不能关一只燕子,不是吗?”应该作为回文返回(真)。忽略所有不是字母的东西

我的问题是:不知道如何具体比较单词。这目前适用于检查单词是否为回文,但我需要找出要更改什么来比较每个单词

public static boolean isWordPalindrome(String input) {
  Deque<Character> q = new LinkedList<>( );
  Deque<Character> q2 = new LinkedList<>( );

  Character letter;   // One character from the input string
  int mismatches = 0; // Number of spots that mismatched
  int i;              // Index for the input string
  int x;

  for (i = 0; i < input.length( ); i++)
  {
 letter = input.charAt(i); // read next character in the string
     if (letter.toString().equals(',') || letter.toString().equals('"') || letter.toString().equals('?') || letter.toString().equals('!') || letter.toString().equals('.') || letter.toString().equals(' ')) {
         //throwaway.add(letter); //ignore above chars and put in throwaway stack
     }
     if (Character.isLetter(letter)) // if letter put into q's
     {
        q.add(letter);
        q2.addFirst(letter);
     }
  } // end of for loop


  System.out.println("q: " + q);
  System.out.println("q2:" + q2);

  while (!q.isEmpty( ))
  {
     if (!Objects.equals(q.remove(), q2.remove()))
        mismatches++;
  }
public静态布尔值isWordPalindrome(字符串输入){
Deque q=newlinkedlist();
Deque q2=新的LinkedList();
字符字母;//输入字符串中的一个字符
int mismatches=0;//不匹配的点的数量
int i;//输入字符串的索引
int x;
对于(i=0;i
我会删除所有特殊字符,用空格分隔字符串,并检查列表是否“对称”:

private静态布尔isSentancePalindrom(字符串语句){
String[]words=句子.replaceAll(“[^a-zA-Z]”,“).split(“\\s+”);
for(int i=0;i
我想到了这个:

   public static boolean checkString(String str) {

    str = str.replaceAll("[,\\?\\.!]+", "").toUpperCase();

    String[] split = str.split(" ");
    String[] reverse = new String[split.length];

    System.arraycopy(split, 0, reverse, 0, split.length);

    List<String> listOfSring = Arrays.asList(split);
    List<String> reversListOfSring = Arrays.asList(reverse);

    Collections.reverse(reversListOfSring);
    return reversListOfSring.equals(listOfSring);   

}
公共静态布尔校验字符串(String str){
str=str.replaceAll(“[,\\?\\.!]”+“,”).toUpperCase();
String[]split=str.split(“”);
String[]reverse=新字符串[split.length];
数组复制(拆分,0,反向,0,拆分,长度);
List listOfSring=Arrays.asList(拆分);
List reversistofstring=Arrays.asList(reverse);
收藏。反向(反向拍卖);
返回reverseListofString.equals(ListofString);
}

我希望这会有所帮助!

@reimeus q2已经是q的反面了。你可以手动操作,这很好,但是有内置的API可以使它成为一个5-10行的解决方案。1.将所有非字母的字符替换为“”(提示:string.Replace)。2.将所有字符都设置为小写(提示:string.tolowercase)。3.反转字符串(提示:stringbuilder.reverse)。4.比较两个字符串(提示:string.Compare)@rafid059:为了清晰起见,这些不是内置API。它们是函数或方法。正确的术语非常重要,尤其是在帮助新开发人员时。@rafid059的目的不是检查回文,这是一个单词回文问题,因此StringBuilder.reverse不是useful@KenWhite请原谅我的措辞,但你是对的。我的意思是标准java库中包含的函数。你可以省略for循环,只需执行
返回listOfString.equals(reverseListOfString)
。此外,你可以省略
arraycopy()
并像初始化第一个列表一样初始化第二个列表。@sinclar感谢您的提示,但在两个列表中进行相同的初始化是不起作用的,因为通过反转一个列表,另一个列表也会反转!抱歉,我误解了,您刚才说的是使用拆分方法初始化两个数组,我明白了,我会忘记的又一次
   public static boolean checkString(String str) {

    str = str.replaceAll("[,\\?\\.!]+", "").toUpperCase();

    String[] split = str.split(" ");
    String[] reverse = new String[split.length];

    System.arraycopy(split, 0, reverse, 0, split.length);

    List<String> listOfSring = Arrays.asList(split);
    List<String> reversListOfSring = Arrays.asList(reverse);

    Collections.reverse(reversListOfSring);
    return reversListOfSring.equals(listOfSring);   

}