《编程珠讥》中comlen返回两个参数字符串中的共同部分的长度,代码如下:
int comlen_error(char *p,char *q) { int i=0; while(*p && *p++==*q++) i++; return i; }
这段小代码显然有错,如果两个字符串第一个字符不相等的话,循环就不执行下去了。
重写了一个没有效率的代码,大体思路是:假设p比q要长,找出q中所有的子串,(q[i,j]包含了所有子串),然后判断子串是否在p中;
记得算法导论上,最大公共子序列是用动态规划实现的,现在都已经忘掉了...
int comlen(char *p,char *q) { int max=0; int count=0; int plen=strlen(p); int qlen=strlen(q); for(int i=0;i<qlen;i++) { for(int j=i+1;j<qlen;j++) //如果j从1开始表示,要判断每一个字符,没有意义 //判断q[i,j]是否在p中 { cout<<i<<","<<j<<":"; int m=i; for(int k=0;k<plen;k++)//从目标数组p中第一个开始匹配 { if(m<=j && p[k]==q[m]) {count++;m++;//cout<<count<<" ";} else {count=0;m=i;} //不相等时,将q重新归为i if(count>max) max=count; } cout<<endl; } } return max; }