0
public boolean isPalindrome()
{

    Stack myStack = new Stack();
    for(Node current = head; current!=null; current = current.next)
    {
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                myStack.pop();
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                continue;
            }
            else
            {
                myStack.push(current.data);
            }
        }else
        {

            myStack.push(current.data);
        }   

    }

    return myStack.isEmpty();
}

ここで行っているのは、スタックを使用して、リンクされたリストが回文であるかどうかを確認することです。それは期待どおりに機能しますが、else 条件でデータがスタックにプッシュされるコードの重複を取り除きたいということだけです。

4

5 に答える 5

7

残念ながら、アルゴリズムは正しくありません。「abbaaa」の場合、そうではありませんが、それは回文であると報告されます。長さを使わずに回文をチェックするのは困難です。

abbaaa () -> push a
bbaaa (a) -> push b
baaa (ba) -> pop b
aaa (a) -> pop a
aa () -> push a
a (a) -> pop a
() -> palindrome
于 2012-08-01T22:31:25.933 に答える
2

これはやや古典的な問題です。Javaでそれを解決する多くの方法があります。最も簡単なものの1つはこれです:

boolean isPalindrome(String s) {
   for (int i=0, len=s.length(); i<len/2; i++) {
      if (s.charAt(i) != s.charAt(len-i-1)) return false;
   }
   return true;
}

(厳密に言えば、これはリファクタリングではなくリファクタリングです。ただし、メソッドのシグネチャを保持するリファクタリングはリファクタリングと見なすことができます...そしてそれは確かにより効率的です)

于 2012-08-01T22:29:08.117 に答える
1

他の2つの条件間のコードの重複を削除するだけの場合は、それらを完全に削除します。

public boolean isPalindrome()
{

    Stack myStack = new Stack();
    for(Node current = head; current!=null; current = current.next)
    {
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                myStack.pop();
                continue;
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                continue;
            }
        }                   
        myStack.push(current.data);             
    }

    return myStack.isEmpty();
}
于 2012-08-01T22:26:13.333 に答える
0

機能の簡素化;

boolean isPalinDrome(String testString) {
    return new StringBuffer(testString).reverse().toString().equals(testString);
}
于 2012-08-01T22:37:27.543 に答える
0

これにより、繰り返しなしで同じ機能が提供されるはずです。ただし、アルゴリズムが正しくないように見えることが指摘されています。

public boolean isPalindrome()
{

    Stack myStack = new Stack();
    boolean doPush;
    for(Node current = head; current!=null; current = current.next)
    {
        doPush = true;
        if(!myStack.isEmpty())
        {
            if(myStack.peek()==current.data)
            {
                doPush = false;
                myStack.pop();
            }else if(current.next!=null&&myStack.peek()==current.next.data)
            {
                doPush = false;
                continue;
            }
        }   
        if(doPush){                
            myStack.push(current.data);  
        }           
    }

    return myStack.isEmpty();
}
于 2012-08-01T22:38:13.500 に答える