Найти в строке кратчайшее симметричное слово - C (СИ)

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

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

Помогите пожалуйста, найти в строке кратчайшее симметрическое слово.

Решение задачи: «Найти в строке кратчайшее симметричное слово»

textual
Листинг программы
#include <string.h>
#include <stdio.h>
#define DELIM " ,.?!;:"
int main()
{
    char str[] = "qteyu zxcdfdcxz iutrg vbv alskdjrtrt sdfg kjhlhjk";
    char *p, *start, *end, *res = NULL;
    int len, flag, min, flag_min = 0;
    for(p = strtok(str, DELIM); p; p = strtok(NULL, DELIM)){
        len = strlen(p);
        for(start = p, end = p + len - 1, flag = 0; start < end; ){
            if(*start++ != *end--){
                flag = 1;
                break;
            }
        }
        if(!flag){
            if(!flag_min){
                min = len;
                flag_min = 1;
                res = p;
            }
            else{
                if(len < min){
                    min = len;
                    res = p;
                }
            }
        }
    }
    if(!res)
        puts("Not found");
    else
        puts(res);
}

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

  1. Включаем необходимые заголовочные файлы для работы со строками и вводом-выводом
  2. Определяем разделитель, в данном случае пробел, запятая, точка, восклицательный и вопросительный знаки, точка с запятой и двоеточие
  3. Объявляем переменные: — str — исходная строка — p — указатель на текущий символ в строке — start — указатель на первый символ в текущем слове — end — указатель на последний символ в текущем слове — res — указатель на найденное симметричное слово (результат) — len — длина текущего слова — flag — флаг наличия нечетных символов в текущем слове — min — минимальная длина среди найденных симметричных слов — flag_min — флаг наличия минимальной длины среди найденных симметричных слов
  4. Используем функцию strtok для разделения исходной строки по разделителям и получения указателя на первое слово
  5. Проверяем длину текущего слова и инициализируем указатели start и end на первый и последний символы текущего слова соответственно
  6. Проходим по всем символам текущего слова, сравнивая их и проверяя на нечетность (если слово должно быть симметричным, то все его символы должны быть четными или нечетными)
  7. Если текущий символ нечетный и предыдущий символ четный, то это означает, что текущее слово не является симметричным, и мы переходим к следующему слову
  8. Если текущее слово является симметричным, то проверяем его длину и обновляем значения min и flag_min, если текущая длина меньше или равна min
  9. Если текущее слово является симметричным и его длина меньше или равна min, то оно становится новым симметричным словом с минимальной длиной
  10. После прохода по всем словам в исходной строке выводим сообщение о том, что симметричное слово не найдено, если res равно NULL, или выводим найденное симметричное слово, если res не равно NULL

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

8   голосов , оценка 3.75 из 5
Похожие ответы