Найти в строке кратчайшее симметричное слово - 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);
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы со строками и вводом-выводом
- Определяем разделитель, в данном случае пробел, запятая, точка, восклицательный и вопросительный знаки, точка с запятой и двоеточие
- Объявляем переменные: — str — исходная строка — p — указатель на текущий символ в строке — start — указатель на первый символ в текущем слове — end — указатель на последний символ в текущем слове — res — указатель на найденное симметричное слово (результат) — len — длина текущего слова — flag — флаг наличия нечетных символов в текущем слове — min — минимальная длина среди найденных симметричных слов — flag_min — флаг наличия минимальной длины среди найденных симметричных слов
- Используем функцию strtok для разделения исходной строки по разделителям и получения указателя на первое слово
- Проверяем длину текущего слова и инициализируем указатели start и end на первый и последний символы текущего слова соответственно
- Проходим по всем символам текущего слова, сравнивая их и проверяя на нечетность (если слово должно быть симметричным, то все его символы должны быть четными или нечетными)
- Если текущий символ нечетный и предыдущий символ четный, то это означает, что текущее слово не является симметричным, и мы переходим к следующему слову
- Если текущее слово является симметричным, то проверяем его длину и обновляем значения min и flag_min, если текущая длина меньше или равна min
- Если текущее слово является симметричным и его длина меньше или равна min, то оно становится новым симметричным словом с минимальной длиной
- После прохода по всем словам в исходной строке выводим сообщение о том, что симметричное слово не найдено, если res равно NULL, или выводим найденное симметричное слово, если res не равно NULL