【问题标题】:Check if a sentence is the same forward and backwards检查一个句子的前后是否相同
【发布时间】:2017-11-20 12:54:12
【问题描述】:

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

我的代码:我知道有多余的部分不是必需的,但我正在尝试测试不同的东西。在我弄清楚如何让它工作后,我会缩短和优化。第一个 for 循环读取字符并将它们放入两个不同的队列和堆栈中。在我有一个名为 reverseWords2 的方法之后,该方法将字符串中的单词以相反的顺序打印出来。

我的问题:使用我目前在这里的代码,一切都返回 true。我的想法是将字符放入 q 和 q2 中,然后将 q2 的单词颠倒,然后将两者进行比较就可以了。有一些问题,我不确定如何解决。

更新:将我的 q 更改为双端 q。现在我只需要找出正确比较单词而不仅仅是字母。有什么建议吗?

我的代码:

public static boolean isWordPalindrome(String input) {

      Deque<Character> q = new LinkedList<>( );
      Deque<Character> q2 = new LinkedList<>( );
      Queue<Character> q3 = new LinkedList<>( );
      Stack<Character> s = new Stack<>( );
      Stack<Character> throwaway = new Stack<>();
      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('.')) {
             throwaway.add(letter); //ignore above chars and put in throwaway stack
         }
         if (Character.isLetter(letter) || letter.toString().equals(' ')) // if letter or space
         {
            q.add(letter);
            q2.add(letter);
            s.push(letter);
         }
      } // end of for loop
      reverseWords2(q2.toString()); // reverse the words of q2

      while (!q.isEmpty( ))
      {
         if (!Objects.equals(q.remove(), q2.removeLast()))
            mismatches++;
      }


      // If there were no mismatches, then the string was a palindrome.
      return (mismatches == 0); 
   }

【问题讨论】:

  • 2个问题和一个堆栈?为什么不一个Q,然后把每端的单词都去掉,看看它们是否相同?
  • 使用Objects.equalsIgnoreCase()Objects 到底是什么?)它被实现为等效于q.remove().equalsIgnoreCase(q2.remove()),或类似的东西。您还应该发布reverseWords2() 的来源。
  • 这段代码有很多问题。您正在使用看起来像java.util.Stack 的东西,几乎在任何情况下都是should not be used。您的算法过于复杂。我的 IDE 对此代码给出了 9 条警告并描述了如何修复它们 - 您使用的是 IDE 吗?
  • @john3136 检查一个单词是否是回文,很容易使用 1 q 和一个堆栈进行比较(因为我正在测试,所以暂时将代码留在那里)。我喜欢你的建议,但是阅读 q 末尾的单词的简单方法是什么?
  • 更根本的是,reverseWords2(q2.toString()); 根本不会修改 q2,因此当您比较 qq2 时,总是相同的。

标签: java


【解决方案1】:

Deque&lt;Character&gt; 更改为Deque&lt;String&gt;。然后,您可以添加一个词到Deque

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2016-08-14
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多