#include <stdio.h> #include <string.h> /* 比较两字符串,注意不区分大小写, 若遇到相等的字符,则开始计数,若遇到不相等的字符,则重新计数 注意思路: 从某一字符串开始比较,则需要再另一个字符串中找到所有以该字符开头的字符串, 并在此过程中不断更新字符串长度,保存每一步得到的更大的长度值 // 注意大部分用例通过时,看看题意,是不是漏了某种情况,如此题的大小写 abbaabbaa bbbbbababbabaabbaabba 9 动态规划可参见:(最长公共子串(序列)) https://blog.csdn.net/u010352111/article/details/53980062 */ int getCommonStrLength(char * s1, char * s2) { int len,i,j,k,q; int count = 0; int max = 0; // 先全部转换为小写,去除大小写之分 // 注意大部分用例通过时,看看题意,是不是漏了某种情况,如此处的大小写 for(i=0;s1[i]!='\0';i++){ if(s1[k]>='A' && s1[k]<='Z'){ s1[k] = s1[k]-'A'+'a'; } } for(k=0;s2[k]!='\0';k++){ if(s2[k]>='A' && s2[k]<='Z'){ s2[k] = s2[k]-'A'+'a'; } } for(i=0;s1[i]!='\0';i++){ for(j=0;s2[j]!='\0';j++){ // 找以s1[i]开头的所有字符串,存储最大的长度值 if(s1[i] == s2[j]){ count = 0; for(k=i,q=j;s1[k]==s2[q] && s1[k]!='\0' && s2[q]!='\0';q++,k++){ count++; if(count>max){ max = count; } } } } count = 0; // 进入下一轮比较时,将上一次的结果清0,重新累计 } return max; } int main() { char s1[10000]=""; char s2[10000]=""; while(scanf("%s %s",s1,s2)!=EOF){ int n; n = getCommonStrLength(s1,s2); printf("%d\n",n); } return 0; }