簡體   English   中英

如何找到最長的回文(java)

[英]How to Find the Longest Palindrome (java)

嗨,我一直在做這個Java程序,我應該輸入一個字符串並輸出可以找到的最長回文..但是我的程序只輸出最長回文的第一個字母..我非常需要您的幫助..謝謝!

應該:

輸入:abcdcbbcdeedcba輸出:bcdeedcb有兩個回文字符串: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);
        }
}

修改后的程序..該程序將給出正確的輸出

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


}

您有兩個錯誤:

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;
    ...

的意思是“如果新字符串的長度大於零個字符,那么我將假定它是迄今為止找到的最長的字符串,並將其返回為LPalindrome”。 這沒有幫助,因為我們以前可能已經找到了更長的回文。

如果是我,我將使用一個靜態變量(例如longestSoFar)來保存迄今為止發現的最長回文(最初為空)。 對於每個新回文,請檢查新回文是否長於longestSoFar。 如果更長,則將其分配給longestSoFar。 然后最后顯示longestSoFar。

通常,如果您在“記住”程序中的某些內容(例如以前看到的值)時遇到麻煩,則必須考慮靜態存儲某些內容,因為一旦局部變量的方法完成,它們就會被忘記。

公共類LongestPalindrome {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
String S= "abcdcba";
printLongestPalindrome(S);
}


public static void printLongestPalindrome(String S)
{
    int maxBack=-1;
    int maxFront = -1;
    int maxLength=0;
    for (int potentialCenter = 0 ; potentialCenter < S.length();potentialCenter ++ )
    {   
        int back = potentialCenter-1;
        int front = potentialCenter + 1;
        int longestPalindrome = 0;
        while(back >=0 && front<S.length() && S.charAt(back)==S.charAt(front))
        {
            back--;
            front++;
            longestPalindrome++;

        }
        if (longestPalindrome > maxLength)
        {
            maxLength = longestPalindrome+1;
            maxBack = back + 1;
            maxFront = front;
        }
        back = potentialCenter;
        front = potentialCenter + 1;
        longestPalindrome=0;
        while(back >=0 && front<S.length() && S.charAt(back)==S.charAt(front))
        {
            back--;
            front++;
            longestPalindrome++;
        }
        if (longestPalindrome > maxLength)
        {
            maxLength = longestPalindrome;
            maxBack = back + 1;
            maxFront = front;
        }

    }


    if (maxLength == 0) System.out.println("There is no Palindrome in the given String");
    else{
        System.out.println("The Longest Palindrome is " + S.substring(maxBack,maxFront) + "of " + maxLength);
    }
}

}

我有自己的辦法以隨機單詞獲得最長回文。 看一下這個

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

System.out.println(longestPalSubstr(in.nextLine().toLowerCase()));


}




static String longestPalSubstr(String str) {

       char [] input = str.toCharArray();
       Set<CharSequence> out = new HashSet<CharSequence>();

      int n1 = str.length()-1;


      for(int a=0;a<=n1;a++)
       {
          for(int m=n1;m>a;m--)
          {

          if(input[a]==input[m])
          {

           String nw = "",nw2="";

           for (int y=a;y<=m;y++)
           {

                nw=nw+input[y];
           }
           for (int t=m;t>=a;t--)
           {

               nw2=nw2+input[t];
           }


           if(nw2.equals(nw))
           {

                out.add(nw);


               break;
           }
       }

     }

   }


    int a = out.size();
    int maxpos=0;
    int max=0;
    Object [] s = out.toArray();

    for(int q=0;q<a;q++)
    {

        if(max<s[q].toString().length())
        {
            max=s[q].toString().length();
            maxpos=q;
        }
    }


   String output = "longest palindrome is : "+s[maxpos].toString()+" and the lengths is : "+ max; 
   return output;



}

此方法將返回最大長度回文及其長度。 這是我嘗試並獲得答案的一種方式。 並且此方法無論其是奇數長度還是偶數長度都將運行。

這是我獲得最長回文的方法。 這將返回長度和回文詞

public static void main(String[] args) {

    Scanner in = new Scanner(System.in);

System.out.println(longestPalSubstr(in.nextLine().toLowerCase()));


}




static String longestPalSubstr(String str) {

       char [] input = str.toCharArray();
       Set<CharSequence> out = new HashSet<CharSequence>();

      int n1 = str.length()-1;


      for(int a=0;a<=n1;a++)
       {
          for(int m=n1;m>a;m--)
          {

          if(input[a]==input[m])
          {

           String nw = "",nw2="";

           for (int y=a;y<=m;y++)
           {

                nw=nw+input[y];
           }
           for (int t=m;t>=a;t--)
           {

               nw2=nw2+input[t];
           }


           if(nw2.equals(nw))
           {

                out.add(nw);


               break;
           }
       }

     }

   }


    int a = out.size();
    int maxpos=0;
    int max=0;
    Object [] s = out.toArray();

    for(int q=0;q<a;q++)
    {

        if(max<s[q].toString().length())
        {
            max=s[q].toString().length();
            maxpos=q;
        }
    }


   String output = "longest palindrome is : "+s[maxpos].toString()+" and the lengths is : "+ max; 
   return output;



}

此方法將返回最大長度回文及其長度。 這是我嘗試並獲得答案的一種方式。 並且此方法無論其是奇數長度還是偶數長度都將運行。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM