新鲜出炉~,创新工厂2013-9-25晚在交大的现场笔试题~
1、回文修复
所谓回文,就是正序和倒序遍历结果一样的字符串,比如“aba”,“abcdedcba”。实现一个方法pal(),输入一个字符串,打印出以这个字符串为前缀的一个回文。比如输入“abc”,pal()方法打印出“abcdcba”或“abcba”;输入“abcb”,可以输出“abcbcba”或“abcba”。如果可能,输出尽量短的结果。以Java语言为例:
void pal(String in);
语言任选。
分析:
这道题说白了就是求以给定字符串为前缀的最短回文串。首先我们要明确的是,假设字符串的长度为len,那么最短长度是原字符串的长度len,最长是以最后一个字符为回文中心的回文串长度即2*len-1。
解法一:
枚举插入长度,即0到len-1,每次检测是否为回文,代码如下:
1 #include <cstdlib> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 char in[100001]; 6 char temp[200005]; 7 bool check(char *in) 8 { 9 int len = strlen(in); 10 int i,j; 11 i = 0; 12 j = len-1; 13 while(i<=j) 14 { 15 if(in[i]!=in[j]) 16 return false; 17 else 18 i++,j--; 19 } 20 return true; 21 } 22 23 int main() 24 { 25 freopen("b2.in","r",stdin); 26 freopen("b2.out","w",stdout); 27 int len; 28 int i,j; 29 int iCnt; 30 while (scanf("%s",in)!=EOF) 31 { 32 len = strlen(in); 33 34 for(iCnt = 0; iCnt<len; iCnt++) 35 { 36 strcpy(temp,in); 37 for(i=iCnt-1,j=len; i>=0; i--,j++) 38 { 39 temp[j] = in[i]; 40 } 41 temp[j] = '