Longest Palindrom Finder

 public class LongestPalindromeFinder {

    public static void main(String[] args) {
        System.out.println(longestPalindromeString("1234"));
        System.out.println(longestPalindromeString("12321"));
        System.out.println(longestPalindromeString("9912321456"));
        System.out.println(longestPalindromeString("9912333321456"));
        System.out.println(longestPalindromeString("12145445499"));
    }

    /**
     * This method returns the longest palindrome in the input String
     *
     * @param in
     * @return
     */
    public static String longestPalindromeString(String in) {
        char[] input = in.toCharArray();
        int longestPalindromeStart = 0;
        int longestPalindromeEnd = 0;

        for (int mid = 0; mid < input.length; mid++) {
            // for odd palindrom case like 12321, 3 will be the mid
            int left = mid-1;
            int right = mid+1;
            // we need to move in the left and right side by 1 place till they reach the end
            while (left >= 0 && right < input.length) {
                // below check to find out if its a palindrome
                if (input[left] == input[right]) {
                    // update global indexes only if this is the longest one till now
                    if (right - left > longestPalindromeEnd - longestPalindromeStart) {
                        longestPalindromeStart = left;
                        longestPalindromeEnd = right;
                    }
                }
                left--;
                right++;
            }
            // for even palindrome, we need to have similar logic with mid size 2
            // for that we will start right from one extra place
            left = mid-1;
            right = mid + 2;// for example 12333321 when we choose 33 as mid
            while (left >= 0 && right < input.length)
            {
                if (input[left] == input[right]) {
                    if (right - left > longestPalindromeEnd - longestPalindromeStart) {
                        longestPalindromeStart = left;
                        longestPalindromeEnd = right;
                    }
                }
                left--;
                right++;
            }
        }
        // we have the start and end indexes for longest palindrome now
        return in.substring(longestPalindromeStart, longestPalindromeEnd + 1);
    }

}

#Longest Palindrom Finder

public class LongestPalindrome {

        static public String expand(String s, int c1, int c2) {
                if (c1 > c2)
                        return null;
                int left = c1, right = c2;
                while (left >= 0 && right < s.length()
                                && s.charAt(left) == s.charAt(right)) {
                        left--;
                        right++;
                }
                return s.substring(left + 1, right);
        }

        // O(n^2)
        static public String longestPalindrome(String s) {
                if (s == null)
                        return null;
                String longest = s.substring(0, 1);
                for (int i = 0; i < s.length() - 1; i++) {
                        String palindrome = expand(s, i, i);
                        if (palindrome.length() > longest.length()) {
                                longest = palindrome;
                        }
                        palindrome = expand(s, i, i + 1);
                        if (palindrome.length() > longest.length()) {
                                longest = palindrome;
                        }
                }
                return longest;
        }

        public static void main(String[] args) {
                System.out.println(longestPalindrome("99ab"));
        }
}


source http://code.google.com/p/code-interviews/source/browse/trunk/CodeInterview/src/string/LongestPalindrome.java?r=72
Reactions

Post a Comment

0 Comments