最近校园招聘又开始了,有一些读研的大学同学问我一些笔试时遇到的面试题目,今天有一题感觉挺有意思,就写了一下。在此跟大家分享一下。题目如下:
所谓回文,就是正序和倒序遍历结果一样的字符串,比如'aba', 'abcdedcba'。实现一个方法pal(),输入一个字符串,打印出以这个字符串为前缀的一个回文。比如输入'abc',pal()方法打印出'abcdcba'或'abcba';输入'abcb',可以输出'abcbcba'或'abcba'。如果可能,输出尽量短的结果。
分析如下:
以abcdc为例,以此为前缀的回文有 'abcdccdcba', 'abcdcdcba','abcdcba',即在输入的字符串后面添加字符,使之成为回文字符串
方法一、最先想到的办法就是把输入的字符串倒序拼接在原字符串后面,如原字符串为'abcdc',倒序为'cdcba',拼接的结果为'abcdccdcba',然后不断删除倒序的字符,拼接上去,判断是否是回文,是,则输出,不是,则继续删除字符。比如:
1)'abcdcdcba'是回文
2)'abcdccba'不是回文
3)'abcdcba'是回文
最后一个是回文的字符串即未最短的回文字符串。
代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 4 #define MAXLEN 100 5 6 int isHuiWen(char *s) 7 { 8 char *s1 = s + strlen(s) - 1; 9 10 while(s < s1) 11 { 12 if(*s++ != *s1--) 13 { 14 return 0; 15 } 16 } 17 return 1; 18 } 19 20 void pal(char *s) 21 { 22 char s1[MAXLEN] = ""; 23 char s2[MAXLEN] = ""; 24 int len = strlen(s); 25 int i = 0; 26 27 for(i = 0;i < len;i++) 28 { 29 s1[i] = s[len - i - 1]; 30 } 31 32 for(i = 0;i < len;i++) 33 { 34 strcpy(s2, s); 35 if(isHuiWen(strcat(s2, s1 + i))) 36 { 37 printf("%s ", s2); 38 } 39 } 40 } 41 42 int main() 43 { 44 char s[MAXLEN]; 45 46 while(scanf("%s", s) != EOF) 47 { 48 pal(s); 49 } 50 51 return 0; 52 }
方法一思路简单、明了,不易出错。但要到最后才能找到最短的一个回文。方法二则介绍如何先找到最短的回文。
方法二:
若需要找最短的回文,则要求在原字符串后面新添的字符串长度尽量短。只要在原字符串中找到某一位置,在此位置(含)后面全为回文,只要把此位置前的字符倒序追加在原字符串后即可。故只需要找出最前的该位置即可。
代码如下:
#include<stdio.h> #include<string.h> #define MAXLEN 100 int isHuiWen(char *s) { char *s1 = s + strlen(s) - 1; while(s < s1) { if(*s++ != *s1--) { return 0; } } return 1; } void pal(char *s) { char s1[MAXLEN] = ""; int len = strlen(s); int i = 0; strcpy(s1, s); for(i = 0;i < len;i++) { /*找到位置i,使i(含)后的字符串为回文*/ if(isHuiWen(s + i)) { int k = len; /*将i之前的字符倒序添加在s后*/ while(i--) { s1[k++] = s[i]; } s1[k] = '