1

こんにちは私はこのJavaプログラムをやっています、私は文字列を入力し、見つけることができる最長の回文を出力する必要があります..しかし私のプログラムは最長の回文の最初の文字だけを出力します..私はひどくあなたの助けが必要です..ありがとう!

すべきこと:

入力:abcdcbbcdeedcba出力:bcdeedcb 2つの回文文字列があります:bcdcbとbcdeedcb

しかし、私が入力したとき:abcdcbbcdeedcba出力:b

import javax.swing.JOptionPane;
public class Palindrome5
{   public static void main(String args[])
    {   String word = JOptionPane.showInputDialog(null, "Input String : ", "INPUT", JOptionPane.QUESTION_MESSAGE);
        String subword = "";
        String revword = "";
        String Out = "";
        int size = word.length();
        boolean c;

        for(int x=0; x<size; x++)
        {   for(int y=x+1; y<size-x; y++)
            {   subword = word.substring(x,y);
                c = comparisonOfreverseword(subword);
                if(c==true)
                {
                    Out = GetLongest(subword);
                }
            }
        }
        JOptionPane.showMessageDialog(null, "Longest Palindrome : " + Out, "OUTPUT", JOptionPane.PLAIN_MESSAGE);
    }

    public static boolean comparisonOfreverseword(String a)
        {   String rev = "";
            int tempo = a.length();
            boolean z=false;
            for(int i = tempo-1; i>=0; i--)
            {
                char let = a.charAt(i);
                rev = rev + let;
            }
            if(a.equalsIgnoreCase(rev))
            {
                z=true;
            }
            return(z);
        }
    public static String GetLongest(String sWord)
        {
            int sLength = sWord.length();
            String Lpalindrome = "";
            int storage = 0;
            if(storage<sLength)
            { 
                storage = sLength;

                Lpalindrome = sWord;
            }
            return(Lpalindrome);
        }
}
4

6 に答える 6

1

変更されたプログラム..このプログラムは正しい出力を提供します

package pract1;

import javax.swing.JOptionPane;
public class Palindrome5
{

    public static void main(String args[])
    {



    String word = JOptionPane.showInputDialog(null, "Input String : ", "INPUT", JOptionPane.QUESTION_MESSAGE);
    String subword = "";
    String revword = "";
    String Out = "";

    int size = word.length();
    boolean c;
        String Lpalindrome = "";
        int  storage=0;

  String out="";

    for(int x=0; x<size; x++)
    {   for(int y=x+1; y<=size; y++)
        {   subword = word.substring(x,y);
            c = comparisonOfreverseword(subword);
            if(c==true)
            {
                 int sLength = subword.length();


                   if(storage<sLength)
                 { 
                     storage = sLength;

                     Lpalindrome = subword;
                     out=Lpalindrome;


                 }

            }
        }
    }
            JOptionPane.showMessageDialog(null, "Longest Palindrome : " + out, "OUTPUT", JOptionPane.PLAIN_MESSAGE);
}

public static boolean comparisonOfreverseword(String a)
    {   String rev = "";
        int tempo = a.length();
        boolean z=false;
        for(int i = tempo-1; i>=0; i--)
        {
            char let = a.charAt(i);
            rev = rev + let;
        }
        if(a.equalsIgnoreCase(rev))
        {
            z=true;
        }
        return(z);
    }


}
于 2016-07-29T10:57:05.587 に答える
0

2 つのバグがあります。

1.

for(int y=x+1; y<size-x; y++)

する必要があります

for(int y=x+1; y<size; y++)

文字列の最後までずっと行きたいからです。前のループでは、ループ全体で x が増加するため、部分文字列のサイズはループ全体で減少します (末尾から x 文字を削除することにより)。

2.

これまでに見つけた最長の文字列またはその長さを保存していません。コード

int storage = 0;
if(storage<sLength) { 
    storage = sLength;
    ...

「新しい文字列が 0 文字よりも長い場合、これまでに見つかった最長の文字列であると想定し、LPalindrome として返します」と言っています。以前にもっと長い回文を見つけたかもしれないので、それは助けにはなりません。

私だったら、静的変数 (例えば、longestSoFar) を作成して、これまでに見つかった最長の回文 (最初は空) を保持します。新しい回文ごとに、新しい回文が最長SoFarより長いかどうかを確認します。長い場合は、longestSoFar に割り当てます。最後に、longestSoFar を表示します。

一般に、プログラム内の何か (以前に見た値など) を「記憶」するのに問題がある場合は、ローカル変数はメソッドが終了すると忘れられるため、何かを静的に保存することを検討する必要があります。

于 2012-08-27T06:37:58.100 に答える
0
public class LongestPalindrome {

    public static void main(String[] args) {
        HashMap<String, Integer> result = findLongestPalindrome("ayrgabcdeedcbaghihg123444456776");
        result.forEach((k, v) -> System.out.println("String:" + k + " Value:" + v));
    }


    private static HashMap<String, Integer> findLongestPalindrome(String str) {
        int i = 0;
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        while (i < str.length()) {
            String alpha = String.valueOf(str.charAt(i));
            if (str.indexOf(str.charAt(i)) != str.lastIndexOf(str.charAt(i))) {
                String pali = str.substring(i, str.lastIndexOf(str.charAt(i)) + 1);
                if (isPalindrome(pali)) {
                    map.put(pali, pali.length());
                    i = str.lastIndexOf(str.charAt(i));
                }
            }
            i++;
        }
        return map;
    }

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

    }

}

このアプローチは簡単です。

出力:
文字列:abcdeedcba 値:10
文字列:4444 値:4文字列:6776 値
:4
文字列:ghihg 値:5

于 2019-03-07T17:27:06.550 に答える