最长的子串回文问题

时间:2015-07-08 19:53:22

标签: c

我觉得我几乎失望了,但出于某种原因,我的第二次测试得出的是较短的回文而不是最长的回文。我已经标记了我认为错误可能来自哪里,但此时我有点不知所措。任何方向都将不胜感激!

#include <stdio.h>
#include <string.h>

/*
 *  Checks whether the characters from position first to position last of the string str form a palindrome.
 *  If it is palindrome it returns 1.  Otherwise it returns 0.
 */
int isPalindrome(int first, int last, char *str)
{
    int i;

    for(i = first; i <= last; i++){
        if(str[i] != str[last-i]){
            return 0;
        }
    }
    return 1;
}

/*
 *  Find and print the largest palindrome found in the string str.  Uses isPalindrome as a helper function.
 */
void largestPalindrome(char *str)
{
    int i, last, pStart, pEnd;
    pStart = 0;
    pEnd = 0;
    int result;

    for(i = 0; i < strlen(str); i++){
        for(last = strlen(str); last >= i; last--){
            result = isPalindrome(i, last, str);
            //Possible error area
            if(result == 1 && ((last-i)>(pEnd-pStart))){
                pStart = i;
                pEnd = last;
            }
        }
    }
    printf("Largest palindrome: ");
    for(i = pStart; i <= pEnd; i++)
        printf("%c", str[i]);
    return;
}

/*
 *  Do not modify this code.
 */
int main(void)
{
    int i = 0;
    /* you can change these strings to other test cases but please change them back before submitting your code */
    //str1 working correctly
    char *str1 = "ABCBACDCBAAB";
    char *str2 = "ABCBAHELLOHOWRACECARAREYOUIAMAIDOINEVERODDOREVENNGGOOD";

    /* test easy example */
    printf("Test String 1: %s\n",str1);
    largestPalindrome(str1);

    /* test hard example */
    printf("\nTest String 2: %s\n",str2);
    largestPalindrome(str2);

    return 0;
}

3 个答案:

答案 0 :(得分:2)

isPalindrome中的代码无法正常工作,除非first为0。

考虑isPalindrome(6, 10, "abcdefghhgX")

  • i = 6;
  • last - i = 4;
  • str[i](又名str[6]又称'g')与str[last-i](又名str[4]又称'e')进行比较,比较的范围之外的数据是应该正在考虑中。
  • 应该与str[10](或者str[9]进行比较 - 取决于last是最终字符的索引还是超出最终字符的索引。

您需要重新访问该代码。另请注意,您的代码将在一次足够的情况下对每对字符进行两次测试。我可能会使用两个索引变量ij,设置为firstlast。循环将递增i并递减j,并且仅在i小于j时继续。

for (int i = first, j = last; i < j; i++, j--)
{
     if (str[i] != str[j])
         return 0;
}
return 1;

答案 1 :(得分:1)

isPalindrome中,将行if(str[i] != str[last-i]){替换为if(str[i] != str[first+last-i]){

答案 2 :(得分:0)

这是你的问题:

for(i = first; i <= last; i++){
    if(str[i] != str[last-i]){
        return 0;
    }
}

应该是:

for(i = first; i <= last; i++, last--){
    if(str[i] != str[last]){
        return 0;
    }
}

另外,这个:

for(last = strlen(str); last >= i; last--){

应该是:

for(last = strlen(str) - 1; last >= i; last--){