需求

给定一个字符串 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语言相关推荐

  1. python最短回文串_LeetCode-Python-214. 最短回文串

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  2. java语言程序设计期末考试试题及答案_《JAVA语言程序设计》期末考试试题及答案1-7.doc...

    <JAVA语言程序设计>期末考试试题及答案1-7 社望斡工耪纱访肝讫否稗仗族锯滥祥缀疏霹辐螟丁哥联退控罐绳屑铸氛券误滚烫周瞎鲸明垢礁蛀撞瓶蔬辗撞往件沽囊炕蔫消辉孽层束沁吨减攻匿少纳涡唆晚亦 ...

  3. 2013c语言二级等级考试试题,计算机等级考试二级c语言考试试题

    C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点.以下是关于计算机等级考试二级c语言考试试题,欢迎大家参考! 一.选择题. 1). 在软件设计中,不属于过程设计工具的是( ...

  4. c语言上机填空改错试题,2013年计算机二级C语言上机试题六十二及答案

    2013年计算机二级.一级.三级等更多考试考前培训请进入教育联展网-中国教育培训第一门户,助您顺利通过计算机等级考试! 填空题 请补充main函数,该函数的功能是:从键盘输入一组字符串,以'*'结束输 ...

  5. 计算机二级c常用函数,计算机等级考试二级C语言的常用库函数试题

    计算机等级考试二级C语言的常用库函数试题 计算机等级考试二级C语言的常用库函数试题 settextstyle()显示字符的当前设置函数 功能:设置当前输出英文字符的字体.大小和方向. 调用方式: vo ...

  6. leetcode 214. 最短回文串 解题报告

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  7. 力扣- - 最短回文串(KMP算法)

    力扣- - 最短回文串(KMP算法) 文章目录 力扣- - 最短回文串(KMP算法) 一.题目描述 二.分析之KMP算法 1.暴力法 2.KMP算法 3.next数组求法1:暴力查找最长的前后缀 4. ...

  8. leetcode214. 最短回文串(kmp)

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  9. leetcode214. 最短回文串

    214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa& ...

  10. LeetCode 214. 最短回文串(字符串哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串. 找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aace ...

最新文章

  1. Tomcat8配置tomcat-users.xml配置
  2. Tensorflow图像通道合并,IndexError: too many indices for array
  3. Redmine性能测试
  4. 数据结构--队列Queue--打印杨辉三角
  5. Numpy 模块的使用
  6. [转]Git使用基础篇
  7. 软考初级程序员知识点整理之 网络协议与标准
  8. cad插件_CAD插件自动编号安装教程
  9. 备战面试日记(4.2.13)- (框架.Spring【十三】之Spring IOC 源码finishBeanFactoryInitialization())
  10. 压缩文件RAR和ZIP的区别
  11. 医院管理系统(Java)
  12. Tensorflow 中padding 的“SAME” 和“VALID” 详解
  13. android 系统app切换,安卓应用转换器(安装应用转为系统应用)app
  14. 教你分割视频,几分钟快速分割多个视频
  15. [VRFC 10-529] concurrent assignment to a non-net an is not permitted [C:/Users/chenxy/Desktop/digit
  16. Android GPU呈现模式分析功能,手机流畅度。仅供参考
  17. 腾讯企业邮箱java-收发邮件
  18. 学校学生学籍的计算机管理属于什么领域,浅谈计算机管理学生学籍信息系统的重要性...
  19. sqli-labs通关笔记(less23-less28a)
  20. dll放在unity哪个文件夹下_Unity中调用DLL库

热门文章

  1. 传智播客 魔法属性 学习
  2. HCI实验图常见类型
  3. 问卷调查设计应注意避免的六大禁忌
  4. opencv 打开视频或摄像头并按格式保存图片,读取图片
  5. unity制作预制体,动态加载预制体,实用资源的导出
  6. Atitit table的类型 表类型目录1. 元数据表 日志表 12. 按照文件结构分为堆组织表(HOT)和索引组织表(IOT) 13. 内存表和文件存储表q 24. 全局表 2
  7. Atitit TPL(事务处理语言 目录 1.1. 事务隔离级别 1 1.2. Savepoint技术 1 2. Tpl 1 2.1.  打开事务 START TRANSACTION; 1 2.2.
  8. atitit 指令集概论原理导论 艾提拉著 目录 2. 2.3 CISC和RISC 复杂指令集 1 1. 指令集(IA:InstructionSet)是指CPU指令系统所能识别(翻译)执行的全部指令
  9. atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
  10. paip.函数式编程方法概述以及总结