【问题标题】:Check if a sentence has the same words forward and backwards检查一个句子前后是否有相同的单词
【发布时间】:2018-05-05 07:52:55
【问题描述】:

我正在尝试检查一个句子是否前后相同或“句子回文”。句子“你可以关笼燕子,不是吗,但你不能吞笼子,可以吗?”应该返回 (True) 作为回文。忽略所有不是字母的内容。

我的问题:不确定如何具体比较单词。这目前适用于检查它们是否是回文的单词,但我需要弄清楚要更改什么来比较每个单词。

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++;
  }

【问题讨论】:

    标签: java palindrome


    【解决方案1】:

    我会删除所有特殊字符,用空格分割字符串并检查列表是否“对称”:

    private static boolean isSentancePalindrom(String sentence) {
        String[] words = sentence.replaceAll("[^a-zA-Z ]", "").split("\\s+");
        for (int i = 0; i < words.length / 2; ++i) {
            if (!words[i].equalsIgnoreCase(words[words.length - i - 1])) {
                return false;
            }
        }
    
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      我想出了这个:

         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);   
      
      }
      

      我希望它会有所帮助!

      【讨论】:

      • 你可以省略 for 循环,只做return listOfString.equals(reverseListOfString)。此外,您可以省略 arraycopy() 并像初始化第一个列表一样初始化第二个列表。
      • @sinclar 感谢您的提示,但是通过在两个列表中进行相同的初始化它并没有工作,因为通过反转另一个也被反转了!
      • 对不起,我误会了,你说的是用split方法初始化两个数组,我明白了,我再编辑一次
      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 2021-05-16
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2022-06-19
      • 1970-01-01
      相关资源
      最近更新 更多