#c #arrays #string #char
#c #массивы #строка #символ
Вопрос:
Я выполняю задание, в котором говорится: Найдите самый большой палиндром в строке. Палиндром — это последовательность, которая читается одинаково как в обратном, так и в прямом направлении. гоночный автомобиль, ева, каяк — вот несколько примеров. Моя проблема в том, что моя строка выводит не весь вывод. Я все еще новичок в этом, поэтому я мало что знаю, но я думаю, что с печатью что-то не так. Я был бы действительно рад, если бы кто-нибудь смог мне помочь.
#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 amp;amp; j!=0)//edit:amp;amp; j!=0 because i=0->str[0] and j=0->str[0] is the same first letter
{
if(str[i]==str[j])
{
printf("%c%cn",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]=%cn",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]=%cn",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. Это потому, что вы печатаете буквы, одновременно определяя палиндром в palindromelength(). Существует несколько способов, один из которых заключается в том, чтобы сначала найти самый большой палиндром, а затем распечатать.
2. @MayurK Я думал, что это то, что я делаю? каким был бы алгоритм того, о чем вы говорите?
Ответ №1:
Это не печать полного палиндрома, потому что вы поместили свой 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» являются частью палиндрома, но вы печатаете только «i». Таким образом, будет напечатана только первая половина палиндрома.
Помимо этого, я думаю, вам нужно обработать много других случаев, например, существует несколько палиндромов, и вам нужно выбрать самый большой. Например: 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) Поиск по палиндрому должен возобновиться с начального индекса «i», когда 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
}
Комментарии:
1. Я не уверен, что вы подразумеваете под i = i_initial . Поскольку я начинаю с 0 для этого конкретного кода, я бы имел в виду 0, верно? в str [i] =str [j], если я печатаю их оба, он просто печатает буквы дважды. Я добавил операторы printf в свой исходный код, чтобы показать значения i и j, которые выводятся на печать. Это отредактировано в моем коде здесь. Также благодарю вас за указание длины палиндрома!
2. Я имею в виду, что в начале palindromelength() сохраните исходное значение i (int i_initial=i;) Всякий раз, когда вы обнаруживаете, что str [i]!=str [j], вам нужно перезапустить поиск. Например, возьмите эту строку и попытайтесь проанализировать логику. — «abcbaxyzba» Вывод должен быть «abcba», верно? Посмотрите, возвращает ли ее ваша функция.
3. Еще один пример: предположим, строка «123abcbaxyzba». Когда i = 3, строка палиндрома должна быть «abcba». Способна ли ваша текущая логика найти это?
4. Я внес еще несколько изменений. Прежде чем находить длину палиндрома, я должен сначала найти палиндром, верно? но мой код даже не работает прямо сейчас. Теперь я понимаю, что вы подразумеваете под i_initial . Я могу выполнить эту часть, но сейчас я сначала проверяю, используя маленькие палиндромы. Спасибо за объяснение!
5. @serene Опять вы копаетесь внутри операторов if. На этом этапе вы все еще находитесь в процессе поиска палиндрома и, следовательно, у вас может не получиться выполнить печать должным образом. Итак, вы можете сделать одну вещь. У вас может быть переменная для хранения длины палиндрома. В случае str [i] ==str[j] увеличьте длину на 2, поскольку два символа являются частью palindorme, в случае str [i]!=str [j] сбросьте длину до нуля. Вне цикла while выведите str[i_initial] в str[i_initial длина-1] символов. Это ваш палиндром.