Алгоритм для нахождения слов-серий в строке - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужен алгоритм для нахождения слов-серий в строке Слова-серии – слова, составленные из повторяющихся подслов. Например, 121212 – слово-серия.

Решение задачи: «Алгоритм для нахождения слов-серий в строке»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int series (char *string, char *substring) {
  6.  int len1=strlen(string);
  7.  int len2=strlen(substring);
  8.  if (len2>len1/2 || len1%len2) return 0;
  9.  int k = len1/len2;
  10.  char *newstring = (char *)malloc((len1+1)*sizeof(char));
  11.  int m=0,i,j;
  12.  for (i=0; i<k; i++) for (j=0; j<len2; j++) newstring[m++]=substring[j];
  13.   //strcat лагает почему-то в новой Studio
  14.  newstring[m]='\0';
  15.  int cmp = strcmp(string,newstring);
  16.  free (newstring);
  17.  return (cmp==0 ? 1 : 0);
  18. }
  19.  
  20. char *substring(char *string, int position, int length) {
  21.  char *pointer= (char *)malloc((length+1)*sizeof(string));
  22.  int c;
  23.  if (pointer == NULL) {
  24.   printf("Unable to allocate memory.\n");
  25.   return NULL;
  26.  }
  27.  for (c = 0 ; c < length ; c++) {
  28.   *(pointer+c) = *(string+position-1);      
  29.   string++;  
  30.  }
  31.  *(pointer+c) = '\0';
  32.  return pointer;
  33. }
  34.  
  35. int substrings (char *string) {
  36.  char *pointer;
  37.  int position = 1, length = 1, temp, string_length;
  38.  temp = string_length = strlen(string);
  39.  printf("Substring of "%s" are\n", string);
  40.  while (position <= string_length) {
  41.   while (length <= temp) {
  42.    pointer = substring(string, position, length);
  43.    printf("%s\n", pointer);
  44.    if (series(string,pointer)) return 1;
  45.    free(pointer);
  46.    length++;
  47.   }
  48.   temp--;
  49.   position++;
  50.   length = 1;
  51.  }
  52.  return 0;
  53. }
  54.  
  55. int main() {
  56.  char *s="111222111222111222111222";
  57.  printf ("\nResult is %d",substrings(s));
  58.  fflush(stdin); getchar();
  59.  return 0;
  60. }

Объяснение кода листинга программы

В этом коде реализован алгоритм поиска слов-серий в строке. Вот список действий, которые происходят в коде:

  1. Функция series принимает два аргумента: исходную строку и подстроку. Если подстрока больше половины исходной строки или подстрока не является серией (одинаковые символы), то возвращается 0. Иначе, находится количество серий в исходной строке, выделяется память под новую строку, и в новой строке копируются символы подстроки. Затем происходит сравнение исходной и новой строки. Если они равны, то возвращается 1, иначе - 0.
  2. Функция substring принимает три аргумента: исходную строку, позицию начала подстроки и длину подстроки. Если не удается выделить память под новую строку, то выводится сообщение об ошибке и возвращается NULL. В противном случае, в новой строке копируются символы из исходной строки, начиная с указанной позиции и длиной указанной длины. Последний символ в новой строке устанавливается в 0.
  3. Функция substrings принимает исходную строку. Сначала определяется длина строки. Затем, пока позиция меньше длины строки, для каждой позиции и длины вычисляется подстрока, и если она является серией, то возвращается 1. После каждой итерации функция series вызывается с аргументами исходной строки и подстроки. Если подстрока является серией, то возвращается 1, иначе вызывается функция substring, чтобы выделить новую подстроку, и процесс повторяется. Если подстрока не является серией, то увеличивается позиция и длина, и процесс повторяется. Если подстрока не найдена, то возвращается 0.
  4. Функция main принимает исходную строку. Сначала вызывается функция substrings с аргументом исходной строки. Затем выводится результат.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы