В C мой код для печати самого большого палиндрома в строке не печатает всю строку палиндрома? - PullRequest
1 голос
/ 03 апреля 2019

Я выполняю задание, которое говорит: Найти самый большой палиндром в строке.Палиндром - это последовательность, которая читается так же, как и вперед.ипподром, канун, каяк - вот несколько примеров.Моя проблема в том, что моя строка не печатает весь вывод.Я все еще новичок в этом, поэтому я мало что знаю, но думаю, что с печатью что-то не так.Я буду очень рад, если кто-нибудь сможет мне помочь.

#include <stdio.h>
#include <string.h> 
int palindromelength(char *str, int i, int j);
char str[100];  
int main()
{
    int i,j,len,n;
    printf("Enter a string ");      
    fgets(str,sizeof(str),stdin);//takes user input
    str[strcspn(str, "\n")] = 0;
    len=strlen(str);
    palindromelength(str, 0, len-1);//function call
    return 0;       
}
int palindromelength(char *str, int i, int j)//compare 
{       
    int len=strlen(str);
    i=0,j=len-1;//i starts from first letter and j starts from the last letter
    while(i<=j && j!=0)//edit:&& j!=0 because i=0->str[0] and j=0->str[0] is the same first letter
    {       
        if(str[i]==str[j])
        {           
            printf("%c%c\n",str[i],str[j]);//edit:added str[j] but it just prints a letter twice
            printf("if: i=%d j=%d str[i]=%c str[j]=%c\n",i,j,str[i],str[j]);/*edit:new                          
             printf to check the i and j values and the corresponding letters under if*/
            i++;//increment i
            j--;//decrement j               
        }           
        if(str[i]!=str[j])//if letters aren't same
        {
            printf("if: i=%d j=%d str[i]=%c str[j]=%c\n",i,j,str[i],str[j]);/*edit:new 
             printf to check the i and j values and the corresponding letters under the other if statement*/
            i=0;//i_initial?
            j--;//only decrement j              
        }
    }   
    return 0;   
}
output//edit to print the new printf statements
Enter a string abcbade //expected:abcba
length is 7
if: i=0 j=6 str[i]=a str[j]=e
if: i=0 j=5 str[i]=a str[j]=d
aa
if: i=0 j=4 str[i]=a str[j]=a
bb
if: i=1 j=3 str[i]=b str[j]=b
cc
if: i=2 j=2 str[i]=c str[j]=c
output 2:
Enter a string dabae   //expected:aba
length is 5
if: i=0 j=4 str[i]=d str[j]=e
if: i=0 j=3 str[i]=d str[j]=a
if: i=0 j=2 str[i]=d str[j]=b
if: i=0 j=1 str[i]=d str[j]=a
output 3:
Enter a string abcbacdcbaab //expected:abcba
length is 12
if: i=0 j=11 str[i]=a str[j]=b
aa
if: i=0 j=10 str[i]=a str[j]=a
if: i=1 j=9 str[i]=b str[j]=a
if: i=0 j=8 str[i]=a str[j]=b
if: i=0 j=7 str[i]=a str[j]=c
if: i=0 j=6 str[i]=a str[j]=d
if: i=0 j=5 str[i]=a str[j]=c
aa
if: i=0 j=4 str[i]=a str[j]=a
bb
if: i=1 j=3 str[i]=b str[j]=b
cc
if: i=2 j=2 str[i]=c str[j]=c

1 Ответ

0 голосов
/ 03 апреля 2019

Он не печатает полный палиндром, потому что вы положили свой printf в чек.

   if(str[i]==str[j])//if letters are same
    {           
        printf("%c",str[i]);//print palindrome letter
                            /*is there a way I can store all the palindrome 
                             characters in a string and print that string?*/
        i++;//increment i
        j--;//decrement j               
    }

Как видите, индексы "i" и "j" являются частью палиндрома, но вы печатаететолько я".Таким образом, будет напечатана только первая половина палиндрома.

Кроме этого, я думаю, что вам нужно разобраться со многими другими случаями, например, с несколькими палиндромами, и вам нужно выбрать самый большой.Например: abcxyzyxdefabcdedcbaxyz

Поэтому я предлагаю,

1) Реализовать функцию, которая возвращает наибольший палиндром из индекса i строки, если таковой имеется.

2) Вызовите эту функцию в цикле от индекса i = 0 до длины-2 исходной строки.

3) Сохранение текущего наибольшего индекса и длины палиндрома.Обновляйте его в каждом цикле.

4) В конце выведите самый большой палиндром.

Функция palindromelength () выполняет все, что я упомянул в шаге # 1.Но вместо того, чтобы печатать буквы, вы должны вернуть длину наибольшего палиндрома из него.

В main () вызывать palindromelength () в цикле с обновленным индексом, как показано ниже.

for(i=0; i<(len-1); i++)
{
    palinrdomeLen = palindromelength(str, i, len-1);
    if(palinrdomeLen > largestPalindromeLen)
    {
        largestPalindromeLen = palinrdomeLen;
        largestPalindromeIdx = i;
    }
}

Кроме этого в palindromelength (),

1) Вам необходимо обновить функцию, чтобы она возвращала длину палиндрома.

2) Поиск палиндрома должен возобновиться с индекса initial "я "когда str[i]!=str[j].

if(str[i]!=str[j])//if letters aren't same
{
    i = i_initial; //i_initial is the "i" value passed to palindromelength()
    j--;//only decrement j              
}
...