HJ85 最长回文串

HJ85最长回文串

这个题目还挺奇怪的,主要是自己生成了一个bug,自己也没有意识到,但是代码运行起来产生了奇怪的结果自己就懵逼了

下面先上代码:

第一版

#include <stdio.h>

int main() {
    char strArray[] = {'\0'};
    while (scanf("%s", strArray) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        printf("%s\n", strArray);
        int len = strlen(strArray);
        int max = 0;
        int maxIndex = 0;
        for(int i = 0; i < len; i++)
        {
            
            int flag = !(i >= 1 && strArray[i - 1] == strArray[i + 1]);
            if(i + 1 < len && strArray[i + 1] != strArray[i] && !(i >= 1 && strArray[i - 1] == strArray[i + 1]))
            {
                continue;
            }
            int count = 0;
            int slow = 0;
            int fast = 0;
            printf("%c, %c", strArray[1], strArray[3]);
            if(i > 1 && i + 1 < len && strArray[i - 1] == strArray[i + 1])
            {
                slow = i;
                fast = i;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;  
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2 + 1;
                printf("33i:%d, count:%d, slow:%d, fast:%d,  i-1:%d, i+1:%d\n", i, count, slow, fast, i-1, i+1);
                //strArray[i - 1]:%c, strArray[i + 1]:%c,  strArray[1], strArray[3]
            }
            else if(i + 1 < len && strArray[i + 1] == strArray[i])
            {
                slow = i;
                fast = i + 1;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;    
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2;
                printf("11count:%d\n", count);
            }
            if(count > max)
            {
                max = count;
                maxIndex = slow + 1;
                printf("22maxIndex:%d, max:%d, count:%d, slow:%d, fast:%d\n", maxIndex, max, count, slow, fast);
            }
        } 

        strArray[maxIndex + max] = '\0';
        printf("%d\n", max);
        printf("maxIndex:%d, max:%d\n", maxIndex, max);
    }
    return 0;
}

这个代码经过debug调试的时候是可以得到正确结果的,但是奇怪的事是当全速运行代码的时候结果就不一样了

增加打印后的结果是这样的:

cdabbacc
11count:0
11count:2
22maxIndex:1, max:2, count:2, slow:0, fast:3
33i:2, count:4, slow:0, fast:4,  i-1:1, i+1:3
22maxIndex:1, max:4, count:4, slow:0, fast:4
33i:3, count:6, slow:0, fast:6,  i-1:2, i+1:4
22maxIndex:1, max:6, count:6, slow:0, fast:6
33i:4, count:8, slow:0, fast:8,  i-1:3, i+1:5
22maxIndex:1, max:8, count:8, slow:0, fast:8
33i:5, count:6, slow:2, fast:8,  i-1:4, i+1:6
33i:6, count:4, slow:4, fast:8,  i-1:5, i+1:7
8
maxIndex:1, max:8

这就很令人费解了。感觉完全不知道是什么原因导致的。问题的转机在于,查看打印信息,i=2的时候竟然得到字符相等的判断。i=2时,对应strArray[1]为d,对应strArray[3]为b。不应该相等的,然后我尝试打印strArray[1]和strArray[3],发现打印竟然还会导致程序死机。这时候我在看strArray,看到strArray在声明时没有指定长度,我尝试指定长度,程序就正常了。。。。

下面是消除异常打印版

#include <stdio.h>

int main() {
    char strArray[351] = {'\0'};
    while (scanf("%s", strArray) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        // printf("%s\n", strArray);
        int len = strlen(strArray);
        int max = 0;
        int maxIndex = 0;
        for(int i = 0; i < len; i++)
        {
            if(strArray[i] == 'c' && strArray[i+1] == 'c' && strArray[i+2] == 'c' && strArray[i+3] == 'c')
            {
                int h = 0;
            }
            int flag = !(i >= 1 && strArray[i - 1] == strArray[i + 1]);
            if(i + 1 < len && strArray[i + 1] != strArray[i] && !(i >= 1 && strArray[i - 1] == strArray[i + 1]))
            {
                continue;
            }
            int count = 0;
            int slow = 0;
            int fast = 0;
            if(i > 1 && i + 1 < len && strArray[i - 1] == strArray[i + 1])
            {
                slow = i;
                fast = i;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;  
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2 + 1;
            }
            else if(i + 1 < len && strArray[i + 1] == strArray[i])
            {
                slow = i;
                fast = i + 1;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;    
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2;
            }
            if(count > max)
            {
                max = count;
                maxIndex = slow + 1;
            }
        } 

        strArray[maxIndex + max] = '\0';
        printf("%d\n", max);
    }
    return 0;
}

这是示例没有通过

用户输入

xpkclvuzvqznepkaytrdxjesixdnahpssjkflplnomwyfigoiuzuouqzzybzblrambrjyoyglqzzvtuitoqqkfyzcqqkrkmiygjvucivhubzaskxzuqytadxfrhpwvjawzstjjojqhcccchqjojjtszwajvwphrfxdatyquzxksazbuhvicuvjgyimkrkqqczyfkqqotiutvzzqlgyoyjrbmarlbzbyzzquouzuiogifywmonlplfkjssphandxisejxdrtyakpenzqvzuvlckpw

预期输出:278

实际输出:4

下面的代码可以解决上述用例,删除else if

#include <stdio.h>

int main() {
    char strArray[351] = {'\0'};
    while (scanf("%s", strArray) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        // printf("%s\n", strArray);
        int len = strlen(strArray);
        int max = 0;
        int maxIndex = 0;
        for(int i = 0; i < len; i++)
        {
            if(strArray[i] == 'c' && strArray[i+1] == 'c' && strArray[i+2] == 'c' && strArray[i+3] == 'c')
            {
                int h = 0;
            }
            int flag = !(i >= 1 && strArray[i - 1] == strArray[i + 1]);
            if(i + 1 < len && strArray[i + 1] != strArray[i] && !(i >= 1 && strArray[i - 1] == strArray[i + 1]))
            {
                continue;
            }
            int count = 0;
            int slow = 0;
            int fast = 0;
            if(i > 1 && i + 1 < len && strArray[i - 1] == strArray[i + 1])
            {
                slow = i;
                fast = i;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;  
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2 + 1;
            }
            if(i + 1 < len && strArray[i + 1] == strArray[i])
            {
                slow = i;
                fast = i + 1;
                while(slow > 0 && fast < len)
                {
                    if(strArray[slow] != strArray[fast])
                    {
                        break;    
                    }
                    slow--;
                    fast++;
                }
                count = fast - slow + 1 - 2;
            }
            if(count > max)
            {
                max = count;
                maxIndex = slow + 1;
            }
        } 

        strArray[maxIndex + max] = '\0';
        printf("%d\n", max);
    }
    return 0;
}

用户输入

abcbaaa

预期输出

5

实际输出

4

上述这个问题就要涉及一直担心问题,就是使用slow–和fast++产生的逻辑比较混乱啊。这边还是要解决一下。上述的代码在取abcba长度的时候就出问题了。

然后我改成了这样,

#include <stdio.h>

int main() {
    char strArray[351] = {'\0'};
    while (scanf("%s", strArray) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        // printf("%s\n", strArray);
        int len = strlen(strArray);
        int max = 0;
        int maxIndex = 0;
        for(int i = 0; i < len; i++)
        {
            if(strArray[i] == 'c' && strArray[i+1] == 'c' && strArray[i+2] == 'c' && strArray[i+3] == 'c')
            {
                int h = 0;
            }
            int flag = !(i >= 1 && strArray[i - 1] == strArray[i + 1]);
            if(i + 1 < len && strArray[i + 1] != strArray[i] && !(i >= 1 && strArray[i - 1] == strArray[i + 1]))
            {
                continue;
            }
            int count = 0;
            int slow = 0;
            int fast = 0;
            if(i > 1 && i + 1 < len && strArray[i - 1] == strArray[i + 1])
            {
                slow = i;
                fast = i;
                while(slow > 0 && fast < len && strArray[slow--] == strArray[fast++])
                {
                    // if()
                    // {
                    //     break;  
                    // }
                    // slow--;
                    // fast++;
                }
                count = fast - slow + 1;
            }
            if(i + 1 < len && strArray[i + 1] == strArray[i])
            {
                slow = i;
                fast = i + 1;
                int diff = 1;
                while(slow > 0 && fast < len && strArray[slow - diff] == strArray[fast + diff])
                {
                    // if(strArray[slow] != strArray[fast])
                    // {
                    //     break;    
                    // }
                    // slow--;
                    // fast++;
                    diff++;
                }
                count = fast - slow + 1 - 2;
            }
            if(count > max)
            {
                max = count;
                maxIndex = slow + 1;
            }
        } 

        strArray[maxIndex + max] = '\0';
        printf("%d\n", max);
    }
    return 0;
}

也是有问题。

针对用例

用户输入

abba

预期输出

4

实际输出

2

修改代码如下:

#include <stdio.h>

int main() {
    char strArray[351] = {'\0'};
    while (scanf("%s", strArray) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        // printf("%s\n", strArray);
        int len = strlen(strArray);
        int max = 0;
        int maxIndex = 0;
        for(int i = 0; i < len; i++)
        {
            if(strArray[i] == 'c' && strArray[i+1] == 'c' && strArray[i+2] == 'c' && strArray[i+3] == 'c')
            {
                int h = 0;
            }
            int flag = !(i >= 1 && strArray[i - 1] == strArray[i + 1]);
            if(i + 1 < len && strArray[i + 1] != strArray[i] && !(i >= 1 && strArray[i - 1] == strArray[i + 1]))
            {
                continue;
            }
            int count = 0;
            int slow = 0;
            int fast = 0;
            if(i > 1 && i + 1 < len && strArray[i - 1] == strArray[i + 1])
            {
                slow = i;
                fast = i;
                int diff = 1;
                while(slow - diff > 0 && fast + diff < len && strArray[slow - diff] == strArray[fast + diff])
                {
                    // if()
                    // {
                    //     break;  
                    // }
                    // slow--;
                    // fast++;
                    diff++;
                }
                count = 2 * diff + 1;
            }
            if(i + 1 < len && strArray[i + 1] == strArray[i])
            {
                slow = i;
                fast = i + 1;
                int diff = 0;
                while(slow - diff > 0 && fast + diff < len && strArray[slow - diff] == strArray[fast + diff])
                {
                    // if(strArray[slow] != strArray[fast])
                    // {
                    //     break;    
                    // }
                    // slow--;
                    // fast++;
                    diff++;
                }
                count = 2 * (diff + 1);
            }
            if(count > max)
            {
                max = count;
                maxIndex = slow + 1;
            }
        } 

        strArray[maxIndex + max] = '\0';
        printf("%d\n", max);
    }
    return 0;
}

也是有问题,即abba的输出对了,但是cdabbacc的输出成了6。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值