水题,原来以为用dp数组 结果wrong了两次 我想还是自己小题大做了···呵呵··
献给初学者作为参考
#include <stdio.h>
#include <string.h>
#define MAX 200
int getCommonStrLength(char * pFirstStr, char * pSecondStr)
{
int m = strlen(pFirstStr);
int n = strlen(pSecondStr);
int max = 0;
int number = 0;
if(pFirstStr==NULL||pSecondStr==NULL)
{
return 0;
}
for( int i = 0;i < m;i ++)
{
for(int j = 0;j < n;j ++)
{
if(i==m||j==n){break;}
while(pFirstStr[i] == pSecondStr[j])
{
i++;
j++;
number++;
}
if(max < number)
{
max = number;
}
if(i==m||j==n){break;}
}
}
return max;
}
int main(void)
{
char s1[200] = {
"\0"
};
char s2[200]= {
"\0"
};
scanf("%s",s1);
scanf("%s",s2);
int num = getCommonStrLength(s1,s2);
printf("%d\n",num);
return 0;
}
==========================================
最长公共子串是常见的面试题
出现困惑的是读者对
最长公共子串
最长公共子序列产生混淆
二者的区别是
最长公共子串 要求子串中的单个字符必须都是连续的
最长公共子序列 要求 去掉一部分元素 只要满足 序列中部分的元素 符合某种规律即可
他们处理办法的核心都是一致的
----------------------------------引用自某大神参加面试的总结
子序列跟子串的求法类似,都是使用动态规划的思想,
s1每次增加一个字符,看与s2当前位置的字符是不是相同,如果相同做相应的处理,如果不同,做另外的处理。
子序列的处理方式:
相同的情况下,该二维数组的位置等于[i-1][j-1]+1
不同的情况下,该二维数组的位置等于MAX(d[i-1][j],d[i][j-1])
下面描述下子串的求法。
最长公共子串,要求字符是连续的。那么在[s1每次增加一个字符,看与s2当前位置的字符是不是相同]
相同的情况下,二维数组的位置等于[i-1][j-1]+1,
不同的情况下,二维数组的位置等于0,最后再查看二维数组的信息即可得到最长公共子串的长度,同时可以回溯二维数组得到最长公共字串的内容。
----------------------------------------------------------------------------------------------
上面是正确的算法 错误的算法我也粘贴出来仅供参考
核心
动态规划
dp【i】【j】 表示 串1 从开始字符到 第i个字符 ,串2从开始字符到第j个字符 ,两个串中最常公共子串的个数
满足如下
1.当s1[i] = s2[j] dp[i][j] = d[i-1][j-1]+1(公共子串满足连续的性质)
2.不等时 dp[i][j] = 0(我不是很理解!求指教,,!!!!!!!!)
#include <stdio.h>
#include <string.h>
#define MAX 200
int dp[MAX][MAX]={
};
int getCommonStrLength(char * pFirstStr, char * pSecondStr)
{
int m = strlen(pFirstStr);
int n = strlen(pSecondStr);
int max = 0;
for( int i = 0;i < m;i ++)
{
for(int j = 0;j < n;j ++)
{
if(pFirstStr[i] == pSecondStr[j])
{
if(i ==0 || j == 0)
{
dp[i][j] = 1;
}
else
{
dp[i][j] = dp[i-1][j-1] + 1;
}
}
if(max < dp[i][j])
{
max = dp[i][j];
}
}
}
return max;
}
int main(void)
{
char s1[200] = {
"\0"
};
char s2[200]= {
"\0"
};
memset(dp+2,0,MAX);
scanf("%s",s1);
scanf("%s",s2);
int num = getCommonStrLength(s1,s2);
printf("%d\n",num);
return 0;
}
------------------------------ps
后最数组也可实现
kmp算法 也就是字符串查找算法 只要是基于后最数组的都可以实现 (怪不得觉得很眼熟。但是kmp算法却一时想不起来 我哭····)
--------------------------------------------------------------
算法学习还是蛮辛苦的 ,求各位大神指教,给出建议,小弟十分感激