Вывод самого длинного палиндрома в строке печатается правильно, несмотря на то, что он не является частью стека

Я написал некоторый код, чтобы найти самый длинный палиндром в строке (палиндром не должен появляться вместе, так как он может быть несмежным)

Это работает почти во всех случаях. Для случая в коде ниже он также выводит правильный палиндром и его длину. Однако есть одна проблема, которая оставила меня в замешательстве. У меня есть функция Compare(), где я сравниваю длину недавно найденного палиндрома с longestPalindromeLength до сих пор, идея в том, что, когда все вспомогательные функции возвращаются обратно в main, статическая (глобальная) переменная называется longestPalindromeString. будет иметь результат.

Моя проблема в том, что я не вижу самый длинный палиндром, то есть "ABCDEEEEDCBA", где-либо в этой функции сравнения (), когда я его печатаю.

Пожалуйста, смотрите мой код

public class LongestPalindromeNonContiguousPrint
{
    //static String S = "abcdcba";
    //static String S = "SGEGGES";
    static String S = "SGEGGESABCDEEEEDCBA";
    //static String S = "abca1221";

    static int longestPalindromeLength = 0;
    static String longestPalindromeString = "";

    public static void main(String[] args)
    {
        System.out.println("Length of the longest palindrome == " + fun(0, S.length()-1,""));
        System.out.println("Longest palindrome == "+longestPalindromeString);
    }

    static int fun(int s, int e, String palindrome)
    {
        String temp = "";

        /* base cases for even */
        if(s == e-1)
        {
            if(S.charAt(s) == S.charAt(e))
            {
                palindrome = palindrome + S.charAt(s);
                compare(palindrome,"even");
                return 2;
            }

            else
            {
                palindrome = palindrome + S.charAt(s);
                compare(palindrome,"odd");
                return 1;
            }
        }

        /* base case for odd */
        if(s == e)
        {
            palindrome = palindrome + S.charAt(s);
            compare(palindrome,"odd");
            return 1;
        }

        /*if(s > e)
            return (S.charAt(s-1) == S.charAt(e+1)) ? 1:0;*/

        /* recurse */
        if(S.charAt(s) == S.charAt(e))
        {
            palindrome = palindrome + S.charAt(s);

            temp = palindrome;
            int rec = fun(s+1, e-1, palindrome);
            palindrome = temp;

            int ret = 2 + rec;
            return ret;
        }

        else 
        {
            temp = palindrome;
            int rec1 = fun(s+1, e, palindrome);
            palindrome = temp;

            temp = palindrome;
            int rec2 = fun(s, e-1, palindrome);
            palindrome = temp;

            return max(rec1, rec2);
        }
    }

    static int max(int a, int b)
    {
        if(a > b)
            return a;
        return b;
    }

    static void compare(String s, String type)
    {
        String palindrome = "";
        String rev = new StringBuilder(s).reverse().toString();

        if(type == "odd")
        {
            palindrome = s + rev.substring(1,rev.length());
        }

        else if(type == "even")
        {
            palindrome =  s + rev;
        }

        if(palindrome.length() > longestPalindromeLength)
        {
            longestPalindromeLength = palindrome.length();
            longestPalindromeString = palindrome;

            /* This does not get printed, I do not understand where this print() function
             * sees this string ABCDEEEEDCBA */
            if(longestPalindromeString == "ABCDEEEEDCBA")
            {
                System.out.println("found ABCDEEEEDCBA");
            }
        } 
    }
}

Выход

Length of the longest palindrome == 12
Longest palindrome == ABCDEEEEDCBA

Пожалуйста, взгляните на функцию сравнения (), я вставил условие if для вывода "ABCDEEEEDCBA", когда это самый длинный палиндром. Но это никогда не попадает в это состояние.

РЕДАКТИРОВАТЬ: ли затмение обрезать часть выходного сигнала, если выходной сигнал слишком велик. Для приведенной ниже программы я наблюдаю разницу в выходных данных между затмением и работой от терминала. Работа на Eclipse дает мне 24811 строк на выходе, однако работа с терминала дает мне 47769 на выходе.

public class LongestPalindromeNonContiguousPrint
{
    //static String S = "abcdcba";
    //static String S = "GEEKSFORGEEKS";
    //static String S = "SGEGGES";
    static String S = "SGEGGESABCDEEEEDCBA";
    //static String S = "abca1221";

    static int longestPalindromeLength = 0;
    static String longestPalindromeString = "";

    public static void main(String[] args)
    {
        System.out.println("Length of the longest palindrome == " + fun(0, S.length()-1,""));
        System.out.println("Longest palindrome == "+longestPalindromeString);
    }

    static int fun(int s, int e, String palindrome)
    {
        String temp = "";

        /* base cases for even */
        if(s == e-1)
        {
            if(S.charAt(s) == S.charAt(e))
            {
                palindrome = palindrome + S.charAt(s);
                compare(palindrome,"even");
                return 2;
            }

            else
            {
                palindrome = palindrome + S.charAt(s);
                compare(palindrome,"odd");
                return 1;
            }
        }

        /* base case for odd */
        if(s == e)
        {
            palindrome = palindrome + S.charAt(s);
            compare(palindrome,"odd");
            return 1;
        }

        /*if(s > e)
            return (S.charAt(s-1) == S.charAt(e+1)) ? 1:0;*/

        /* recurse */
        if(S.charAt(s) == S.charAt(e))
        {
            palindrome = palindrome + S.charAt(s);

            temp = palindrome;
            int rec = fun(s+1, e-1, palindrome);
            palindrome = temp;

            int ret = 2 + rec;
            return ret;
        }

        else 
        {
            temp = palindrome;
            int rec1 = fun(s+1, e, palindrome);
            palindrome = temp;

            temp = palindrome;
            int rec2 = fun(s, e-1, palindrome);
            palindrome = temp;

            return max(rec1, rec2);
        }
    }

    static int max(int a, int b)
    {
        if(a > b)
            return a;
        return b;
    }

    static void compare(String s, String type)
    {
        String palindrome = "";
        String rev = new StringBuilder(s).reverse().toString();

        if(type == "odd")
        {
            palindrome = s + rev.substring(1,rev.length());
        }

        else if(type == "even")
        {
            palindrome =  s + rev;
        }

        System.out.println(palindrome);

        if(palindrome.length() > longestPalindromeLength)
        {
            longestPalindromeLength = palindrome.length();
            longestPalindromeString = palindrome;

            /*if(palindrome.equals("ABCDEEEEDCBA"))
            {
                System.out.println("found ABCDEEEEDCBA");
            }*/
        } 
    }
}

1 ответ

Решение

Вы сравниваете строки с == вместо String"s equals метод.

Другие вопросы по тегам