【发布时间】: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,因此当您比较q和q2时,总是相同的。
标签: java