我觉得我几乎失望了,但出于某种原因,我的第二次测试得出的是较短的回文而不是最长的回文。我已经标记了我认为错误可能来自哪里,但此时我有点不知所措。任何方向都将不胜感激!
#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;
}
答案 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
是最终字符的索引还是超出最终字符的索引。您需要重新访问该代码。另请注意,您的代码将在一次足够的情况下对每对字符进行两次测试。我可能会使用两个索引变量i
和j
,设置为first
和last
。循环将递增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--){