#c
Вопрос:
Ссылка : https://www.codechef.com/LRNDSA01/problems/LAPIN
Описание программы : Лапиндром определяется как строка, которая при разделении посередине дает две половины, имеющие одинаковые символы и одинаковую частоту каждого символа. Если в строке нечетное количество символов, мы игнорируем средний символ и проверяем наличие лапиндрома. Например, gaga-это лапиндром, так как две половины ga и ga имеют одинаковые символы с одинаковой частотой. Кроме того, abccab, rotor и xyzxy являются несколькими примерами лапиндромов. Обратите внимание, что аббааб НЕ является лапиндромом. Две половины содержат одинаковые символы, но их частоты не совпадают. Ваша задача проста. Учитывая строку, вам нужно определить, является ли она лапиндромом.
Мой код :
#include <stdio.h>
#include <string.h>
int main(){
int i,t,len,j,k,arr_indx,check = 0;
char s[1000],left[500],right[500];
//s[] = input string
//left[] = left side of the string after division
//right[] = right side of the string after division
//len = length of the input string
//arr_index = It is the array index
scanf("%d",amp;t);
for(i = 1;i <= t;i )
{
scanf("%s",amp;s);
len = strlen(s);
//if even length
if(len % 2 == 0)
{
for(j = 0;j < len/2;j )
left[j] = s[j];
left[j] = '';
for(k = len/2,arr_indx = 0;k < len;k ,arr_indx )
right[arr_indx] = s[k];
right[arr_indx] = '';
}
//if odd length
else
{
for(j = 0;j < len/2;j )
left[j] = s[j];
left[j] = '';
for(k = ((len/2) 1),arr_indx = 0;k < len;k ,arr_indx )
right[arr_indx] = s[k];
right[arr_indx] = '';
}
//Checking
for(k = 0;k < strlen(left);k )
for(j = 0;j < strlen(right);j )
if(left[k] == right[j])
check ;
if(check == strlen(left)) //printing
printf("YESn");
else
printf("NOn");
check = 0;
}
return 0;
}
Комментарии:
1. Пожалуйста, укажите входные данные, ожидаемые результаты и фактические результаты. В настоящее время мы не можем догадаться, что не так с вашим кодом, если только мы не потратим больше времени на его чтение и тестирование, чем кто-либо из нас.
2. Давайте представим себе строку
aaaaaa
, это наверняка лапиндром. Сколько это будетcheck
стоить? Ожидая получить 3(почему ?), фактический результат: 9. Хм, это не совсем правильно. Ваша логика проверки неверна.3. Размеры массивов для массивов
s
left
,right
должны быть 1001 , 501, 501 соответственно, чтобы можно было хранить нулевой символ (). И, в целом, логика не верна. Даже если бы это было правильно, алгоритм был бы очень неэффективен (читай медленно).
Ответ №1:
Алгоритм, который вы реализовали, одновременно неверен и очень медленный (даже если он был правильным). Поскольку входные символы ограничены a..z, вы можете реализовать быстрый алгоритм, сравнив частоты букв в левой и правой частях входного текста. Пример реализации приведен ниже. Код предполагает, что коды символов a..z являются смежными, что не гарантируется стандартом C.
#include <stdio.h>
#include <string.h>
#define NLETTERS ('z' - 'a' 1)
int main(void)
{
int T;
scanf("%d ", amp;T);
while (--T >= 0) {
char buf[1002];
int lfreq[NLETTERS] = {0}, rfreq[NLETTERS] = {0}, yes = 1;
fgets(buf, sizeof buf, stdin);
for (int i = 0, j = strcspn(buf, "n") - 1; i < j; i, --j) {
lfreq[buf[i] - 'a'];
rfreq[buf[j] - 'a'];
}
for (int i = 0; i < NLETTERS; i) {
if (lfreq[i] != rfreq[i]) {
yes = 0;
break;
}
}
puts(yes ? "YES" : "NO");
}
return 0;
}