调试代码以找到字符串中最长的回文

时间:2013-10-02 23:33:14

标签: java algorithm

我正在尝试理解在给定字符串中找到最长回文的代码片段。这是代码段

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

}

但是,输入"bb"返回"b""abb"返回"a"而不是bb,代码段似乎失败了。

有关导致该错误的任何想法?

Source代码段。

1 个答案:

答案 0 :(得分:1)

要解决此更改,请执行以下操作:

  1. 同时,如果两个字符不相等,请添加一个休息时间。

    while(/*....*/)
    {
         if(/*...*/)
         {
             //....
         }
         else           // add this
             break;     // and this   
    }
    
  2. 偶数情况的左右初始设置错误。它假设中间两个字符是相同的。将其更改为

    left = mid;
    right = mid+1;
    
  3. 这与我刚刚阅读的原始代码的评论中所说的完全相同......