Member 13474465 Ответов: 2

Palindrome count - количество строк


Учитывая строку S, подсчитайте количество непустых подстрок, которые являются палиндромами.
Подстрока-это любая непрерывная последовательность символов в строке.
Строка называется палиндромом, если обратная сторона строки совпадает с ней самой.
Две подстроки различны, если они встречаются в разных позициях в S

Ввод
Входные данные содержат только одну строку, содержащую строку S.

Выход
Выведите одно число, количество отсчетов в строке.

Ограничения
1 <= |S| <= 50
S содержит только строчные латинские буквы, то есть символы от А до Я.

Что я уже пробовал:

#include <stdio.h>
#include<string.h>
int check(char s[],char a[],int x,int y)
{
    int i,p=0;
    for(i=x;i<=y;i++)
    {
        a[p]=s[i];
        p++;
    }
    a[p]='\0';
    int c=1;
    int j=0;
    while(j<=(strlen(a)/2))
    {
        if(a[j]!=a[strlen(a)-j-1])
        {
            c=0;
        }
        j++;
    }
    return c;
}
int main()
{
    char s[50];
    scanf("%s",s);
    char a[50];
    int i,j,c=0;
    for(i=0;i<strlen(s);i++)
    {
        for(j=i;j<strlen(s);j++)
        {
            int b=check(s,a,i,j);
            if(b==1)
            {
                c++;
            }
            
        }
    }
    printf("Number of palindromic substrings:%d",c);
  return 0;
}

OriginalGriff

И что же?
Что он делает такого, чего вы не ожидали, или не делаете того, что вы сделали?
Что вы пытались выяснить, почему он это делает?
Где ты застрял?
Какая помощь вам нужна?

Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Member 13474465

это не считая всех палиндромов.когда я считаю вручную, я могу найти больше.

Patrice T

А у вас есть вопрос или проблема?

Member 13474465

проблема в том,что он не считает все строки

Patrice T

Приведите пример !
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

2 Ответов

Рейтинг:
1

Patrice T

Цитата:
проблема в том,что он не считает все строки

Первое действие заключается в добавлении кода для отслеживания того, что делает ваш код:
...
    while(j<=(strlen(a)/2))
    {
        if(a[j]!=a[strlen(a)-j-1])
        {
            c=0;
        }
        j++;
    }
    if (c==1)
    {
        printf("%s\n",a);
    }
    return c;
}

Затем посмотрите, какие палиндромы найдены, а какие нет.

Если намека на недостающие достаточно, переходите к исправлению.
В противном случае перейдите к отладчику и посмотрите, почему в нем отсутствует палиндром.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

[обновление]
Кстати, Ваш алгоритм очень наивен и очень неэффективен. Рабочая нагрузка растет с квадратом длины s, Это O(n2).
Небольшой анализ показывает, что любой большой палиндром строится вокруг меньшего до размера 2 или 3. Поэтому, если у вас нет маленького палиндрома вокруг данного центра, у вас не будет большего палиндрома вокруг того же центра.
Это означает, что с помощью 'abcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh' вам не нужно проверять большие палиндромы, потому что у вас нет маленьких, эта оптимизация O(n).


Рейтинг:
1

Michael Haephrati

void palindromeSubStrs(string s)
{
    map<string, int> m;
    int n = s.size();
 
    int R[2][n+1];
  
    for (int j = 0; j <= 1; j++)
    {
        int rp = 0;   
        R[j][0] = 0;
 
        int i = 1;
        while (i <= n)
        {
            while (s[i - rp - 1] == s[i + j + rp])
                rp++;   
            R[j][i] = rp;
            int k = 1;
            while ((R[j][i - k] != rp - k) && (k < rp))
            {
                R[j][i + k] = min(R[j][i - k],rp - k);
                k++;
            }
            rp = max(rp - k,0);
            i += k;
        }
    }
 
    s = s.substr(1, n);
 
    m[string(1, s[0])]=1;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= 1; j++)
            for (int rp = R[j][i]; rp > 0; rp--)
               m[s.substr(i - rp - 1, 2 * rp + j)]=1;
        m[string(1, s[i])]=1;
    }
 
   cout << "There are " << m.size()-1
        << " palindrome sub-strings";
   map<string, int>::iterator ii;
   for (ii = m.begin(); ii!=m.end(); ++ii)
      cout << (*ii).first << endl;
}
 
int main()
{
    palindromeSubStrs("abaabbbba");
    return 0;
}


CPallini

Вопрос помечен буквой "С".

Patrice T

На какой вопрос вы ответили ?

Michael Haephrati

Я ответил на этот вопрос, но пропустил тег "с". Сожалеть об этом