被鄙视了一道题,求一个字符串里面最大的子回文。
我想了想,基本的方案是:
把字符串正看和反看,作为两个字符串,然后求最大子串--->这样就简单一些了。
但是,说实话,如果在笔试的时候你能写出借助二维数组的那个版本到真是不太容易的一件事情。
所以,我觉得这个文章写的不错,简单,实用:
http://blog.youkuaiyun.com/shaohui/archive/2006/06/09/784577.aspx
但是原文由一个小bug,修正一下,并增加了一些测试case
- #include <stdio.h>
- #include <string.h>
- #define BUFFER_SIZE 255
- int commstr(char *s1, char *s2){
- char buf[BUFFER_SIZE];
- int start,cnt=-1,len1=strlen(s1),len2=strlen(s2);
- for (start=0; start+len2<=len1; start++){//原文是小于不是小于等于
- for (cnt=0; cnt<len2; cnt++)
- if (s1[start+cnt] != s2[cnt])
- break;
- if (cnt >= len2)//如果在s1中找到一个子串和s1相同
- break;
- }
- if (cnt >= len2)//如果s2是s1的子串
- return len2;
- //把s2中后len2-1个字符构成的串同s1比较,并求子串长度
- len1 = commstr(s1,s2+1);
- //把s2中前len2-1个字符构成的串同s1比较,并求子串长度
- strncpy(buf,s2,len2-1);
- buf[len2-1] = '/0';
- len2 = commstr(s1,buf);
- //返回较大者
- return len1 > len2 ? len1 : len2;
- }
- int main(int arc, char *argv){
- printf("%d/n",commstr("fghxxhij","degfghxxhfij"));
- printf("%d/n",commstr("shaohui","huishao"));
- printf("%d/n",commstr("aaabbaa","aabbaaa"));
- printf("%d/n",commstr("aaaaa","aaaaa"));
- printf("%d/n",commstr("shaoshaohuihui","shaohuishaoshaohuihui"));
- return 0;
- }