c语言回文串试题,最短回文串 -- C语言
需求
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: "aacecaaa"
输出: "aaacecaaa"
示例 2:
输入: "abcd"
输出: "dcbabcd"
思路
要找到最短的添加内容,就相当于从字符串位置0开始,查找到最长的回文串,最长回文串后面的部分称为有效后缀,我们将有效后缀反转,添加到原有字符串的最前面就可以了
代码实现
/*
* 需求
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入: "aacecaaa"
输出: "aaacecaaa"
示例 2:
输入: "abcd"
输出: "dcbabcd"
gcc shortestPalindrome.c -g -o a.exe -DDEBUG
*/
#include #include #include #include #include #ifdef DEBUG
#define LOG(fmt, args...) fprintf(stdout, fmt, ##args)
#define BREAKER(a, b, c) breaker(a, b, c)
#else
#define LOG(fmt,...)
#define BREAKER(a, b, c)
#endif
#define TRUE 1
#define FALSE 0
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) > (b) ? (b) : (a))
bool isPalindromeStr(char * head, char * tail){
bool ret = true;
while(head < tail){
if(*head != *tail){
ret = false;
break;
}
head++;
tail--;
}
return ret;
}
int longestPalindromeSubstrFromHead(char * s, char ** pdrear){
int len = 0, pdlen = 0;
char * rear = NULL;
len = strlen(s);
rear = s + len - 1;
if('\0' == *s){
*pdrear = s;
return pdlen;
}
do {
if(isPalindromeStr(s, rear)){
/*找到了从0开始最长的回文串*/
break;
}
rear--;
} while(rear != s);
*pdrear = rear;
pdlen = rear - s + 1;
return pdlen;
}
char * shortestPalindrome(char * s){
if(NULL == s){
return NULL;
}
char * rear = NULL, * pdrear = NULL;
char * substr = NULL, *p = NULL;
int pdlen = 0, len = 0, total = 0;
len = strlen(s);
if(0 == len){ /*空字符串*/
substr = (char *)malloc(1 * sizeof(char));
*substr = '\0';
goto out;
}
rear = s + len - 1;
pdlen = longestPalindromeSubstrFromHead(s, &pdrear);
total = len - pdlen + len + 1; /*后缀长度 + 原有字符串长度 + '\0' */
LOG("s = %s, pdlen = %d, pdrear = %c, total= %d\n", s, pdlen, *pdrear, total);
substr = (char *)malloc(total * sizeof(char));
if(NULL == substr){
return NULL;
}
p = substr;
while(rear != pdrear){
*p = *rear;
p++;
rear--;
}
memcpy(p, s, len);
substr[total - 1] = '\0';
LOG("substr = %s\n", substr);
out:
return substr;
}
void testshortestPalindrome(void){
printf("\n************ testshortestPalindrome ************ \n");
char * pdstr = NULL;
#if 1
int pdlen = 0;
char astr1[100] = "aacecaaa";
char * rear = NULL;
pdlen = longestPalindromeSubstrFromHead(astr1, &rear);
*(rear + 1) = '\0';
printf("The longest PalindromeSubstr From Head is \"%s\", long %d \n", astr1, pdlen);
char astr2[100] = "abcd";
rear = NULL;
pdlen = longestPalindromeSubstrFromHead(astr2, &rear);
*(rear + 1) = '\0';
printf("The longest PalindromeSubstr From Head is \"%s\" long %d \n", astr2, pdlen);
char astr3[100] = "";
rear = NULL;
pdlen = longestPalindromeSubstrFromHead(astr3, &rear);
*(rear + 1) = '\0';
printf("The longest PalindromeSubstr From Head is \"%s\" long %d \n", astr3, pdlen);
#endif
#if 1
/*testcase 1*/
char * str1 = "aacecaaa";
pdstr = shortestPalindrome(str1);
printf("The shortest pdstr is \"%s\" \n", pdstr);
if(NULL != pdstr){
free(pdstr);
pdstr = NULL;
}
/*testcase 2*/
char * str2 = "abcd";
pdstr = shortestPalindrome(str2);
printf("The shortest pdstr is \"%s\" \n", pdstr);
if(NULL != pdstr){
free(pdstr);
pdstr = NULL;
}
/*testcase 2*/
char * str3 = "";
pdstr = shortestPalindrome(str3);
printf("The shortest pdstr is \"%s\" \n", pdstr);
if(NULL != pdstr){
free(pdstr);
pdstr = NULL;
}
#endif
return;
}
int main(int argc, char ** argv){
testshortestPalindrome();
}
代码编译
gcc shortestPalindrome.c -g -o a.exe -DDEBUG
调试输出
************ testshortestPalindrome ************
The longest PalindromeSubstr From Head is "aacecaa", long 7
The longest PalindromeSubstr From Head is "a" long 1
The longest PalindromeSubstr From Head is "" long 0
s = aacecaaa, pdlen = 7, pdrear = a, total= 10
substr = aaacecaaa
The shortest pdstr is "aaacecaaa"
s = abcd, pdlen = 1, pdrear = a, total= 8
substr = dcbabcd
The shortest pdstr is "dcbabcd"
The shortest pdstr is ""
c语言回文串试题,最短回文串 -- C语言相关推荐
- python最短回文串_LeetCode-Python-214. 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- java语言程序设计期末考试试题及答案_《JAVA语言程序设计》期末考试试题及答案1-7.doc...
<JAVA语言程序设计>期末考试试题及答案1-7 社望斡工耪纱访肝讫否稗仗族锯滥祥缀疏霹辐螟丁哥联退控罐绳屑铸氛券误滚烫周瞎鲸明垢礁蛀撞瓶蔬辗撞往件沽囊炕蔫消辉孽层束沁吨减攻匿少纳涡唆晚亦 ...
- 2013c语言二级等级考试试题,计算机等级考试二级c语言考试试题
C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.以下是关于计算机等级考试二级c语言考试试题,欢迎大家参考! 一.选择题. 1). 在软件设计中,不属于过程设计工具的是( ...
- c语言上机填空改错试题,2013年计算机二级C语言上机试题六十二及答案
2013年计算机二级.一级.三级等更多考试考前培训请进入教育联展网-中国教育培训第一门户,助您顺利通过计算机等级考试! 填空题 请补充main函数,该函数的功能是:从键盘输入一组字符串,以'*'结束输 ...
- 计算机二级c常用函数,计算机等级考试二级C语言的常用库函数试题
计算机等级考试二级C语言的常用库函数试题 计算机等级考试二级C语言的常用库函数试题 settextstyle()显示字符的当前设置函数 功能:设置当前输出英文字符的字体.大小和方向. 调用方式: vo ...
- leetcode 214. 最短回文串 解题报告
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- 力扣- - 最短回文串(KMP算法)
力扣- - 最短回文串(KMP算法) 文章目录 力扣- - 最短回文串(KMP算法) 一.题目描述 二.分析之KMP算法 1.暴力法 2.KMP算法 3.next数组求法1:暴力查找最长的前后缀 4. ...
- leetcode214. 最短回文串(kmp)
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- leetcode214. 最短回文串
214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa& ...
- LeetCode 214. 最短回文串(字符串哈希)
文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串. 找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aace ...
最新文章
- 数字信号处理中卷积的计算
- 漫游Kafka设计篇之性能优化
- java class 字符串_java基础知识四 math类 字符 字符串 控制台输入输出 StringBuilder与StringBuffer...
- Python笔记-CAPM(资本资产定价模型)例子
- 定义返回函数指针(地址)的函数
- 微服务升级_SpringCloud Alibaba工作笔记0005---spring gateway非阻塞异步模型
- iOS safari浏览器上overflow: scroll元素无法滚动bug深究
- vue pc移动两个html,vue一套代码适应移动端,pc端
- mysql自带的全文索引_MySql全文索引详解
- 诺基亚PC套件界面设计
- Python搭建服务器
- 迪文屏中关于MODBUS的接口配置
- 士兵突击:每个人的心灵史
- 银河麒麟国产操作系统使用指南
- 怎么用C语言搜索有根区间,C语言 判断一个数字是否在一个指定的区间范围内?求解答。。。。...
- TOOL 一个裴蜀定理解析器
- 【Vue3】学习笔记-reactive响应式
- hadoop之hdfs的shell命令操作
- 使用PyTorch构建GAN生成对抗网络源码(详细步骤讲解+注释版)02 人脸识别 下
- openstack 安装keystone初始化数据库失败