是否有更优雅的解法实现Kattis平台的Anti-palindrome问题?
问题背景
问题来自Kattis平台的Anti-palindrome题目
问题描述
给定一行文本,需要判断其中是否存在长度至少为2的回文子串(判断时忽略空格、标点等非字母字符,大小写视为相同)。如果存在,输出"Palindrome";否则输出"Anti-palindrome"。输入保证至少包含一个字母字符,长度不超过80个字符。
输入要求
- 输入文本长度为1至80个字符
- 内容至少包含一个字母,可包含空格、标点及其他非字母字符
输出要求
- 若存在符合条件的回文子串,输出
Palindrome - 若不存在,输出
Anti-palindrome
我的实现解法
palindrome() 函数
这是一个bool类型的函数,用于判断字符串str中从start到end(包含两端)的子串是否为回文。
bool palindrome(char *str, long start, long end) { if (start >= end) { return true; } if (!isalpha(str[start])) { return palindrome(str, start + 1, end); } if (!isalpha(str[end])) { return palindrome(str, start, end - 1); } if (tolower(str[start]) != tolower(str[end])) { return false; } return palindrome(str, start + 1, end - 1); }
main() 函数
主函数通过两层循环遍历输入文本line的所有子串,调用上述函数判断是否存在回文。假设cs1010_read_line、cs1010_println_string这两个非标准输入输出函数可正常工作。
int main() { char *line = cs1010_read_line(); if (line == NULL) { return 1; } long len = (long)strlen(line) - 1; // 减去换行符的长度 for (long start = 0; start < len - 2; start += 1) { for (long end = start + 2; end < len; end += 1) { if (palindrome(line, start, end)) { cs1010_println_string("Palindrome"); free(line); return 0; } } } cs1010_println_string("Anti-palindrome"); free(line); }
请教问题
请问有没有更优雅的解法?可以在效率或者代码简洁性上对这个实现进行优化吗?
内容的提问来源于stack exchange,提问作者mendax1234
相关产品推荐
相关产品推荐

