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。