水题,原来以为用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算法却一时想不起来  我哭····)

--------------------------------------------------------------

算法学习还是蛮辛苦的 ,求各位大神指教,给出建议,小弟十分感激

华为 oj 公共子串计算的更多相关文章

  1. 华为OJ: 公共字符串计算

    有几个需要注意的地方,这个问题是不是大写和小写之间的区别.这样你就输入字符串大写或小写转换的计算前. 第二个,定要清晰.先将s1从[i]处開始与s2的[j]開始匹配,不相等则j++直到j等于s2.le ...

  2. 华为OJ之最长公共子串

    题目描述: 对于两个给定的字符串,给出他们的最长公共子串. 题目分析: 1,最长公共子串(LCS)实际上是最长公共子序列的一种特殊情况,相当于是求连续的最长子序列.我们今天先解决这个特殊情况,后续博文 ...

  3. 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  4. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

  5. 华为OJ2011-最长公共子串

    一.题目描述 描述: 计算两个字符串的最大公共子串(Longest Common Substring)的长度,字符区分大小写. 输入: 输入两个字符串 输出: 输出一个整数 样例输入: asdfas ...

  6. 华为OJ之最长公共子序列

    题目描述: 对于两个给定的字符串,给出他们的最长公共子序列. 题目分析: 1,在之前的博文(http://www.cnblogs.com/yonguo123/p/6711360.html)中我们讨论了 ...

  7. 最长公共子序列PK最长公共子串

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...

  8. lintcode :最长公共子串

    题目 最长公共子串 给出两个字符串,找到最长公共子串,并返回其长度. 样例 给出A=“ABCD”,B=“CBCE”,返回 2 注意 子串的字符应该连续的出现在原字符串中,这与子序列有所不同. 解题 注 ...

  9. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

随机推荐

  1. java下tcp的socket连接案例

    package cn.stat.p4.ipdemo; import java.io.BufferedReader; import java.io.IOException; import java.io ...

  2. pyqt5通过文本对话框打开文件

    点击按钮,打开文本对话框,找一人文件,打开并显示内容 QFIleDialog                                                              ...

  3. 开发纯ndk程序之环境搭配

    安装ndk 从安卓官网下载,ndk,双击解压到当前文件夹.建议想装在那个文件夹便解压到那个文件夹,而且文件夹的路径中不要有空格,因为gcc编译的时候会把空格前后两个字符串作为两个文件夹来对待. 使用g ...

  4. BASE64的实现

    原由 项目中经常需要使用base64进行处理,通过base64可以将特殊字符转化为普通可见字符,便于网络传输,代价是增长了传输长度. base64将每3个byte转化为4个6bit位,然后高位补两个零 ...

  5. android textview 行间距

    设置行间距:android:lineSpacingExtra 设置行间距的倍数:android:lineSpacingMultiplier 如下:设置行间距为3,行间距倍数为1.5 <TextV ...

  6. [LeetCode 122] - 买入与卖出股票的最佳时机II(Best Time to Buy and Sell Stock II)

    问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 设计一个算法找出最大的利润值.你可以进行任意多次的交易(即多次的卖出并买入一份股票).你不能在同一时间进行多次交易(即你必须在再次 ...

  7. quote, quasiquote, unquote和unquote-splicing

    关于符号类型 符号类型又称引用类型,在概要一文中本人介绍得非常的模糊,使很多初学者不理解.符号类型在Scheme语言中是最基础也是最重要的一种类型,这是因为Scheme语言的祖先Lisp语言的最初目的 ...

  8. cf443B Kolya and Tandem Repeat

    B. Kolya and Tandem Repeat time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  9. tyvj1039忠诚2

    描述 Description 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨, ...

  10. hdu5045:带权二分图匹配

    题目大意 : n个人 做m道题,其中 每连续的n道必须由不同的人做 已知第i人做出第j题的概率为pij,求最大期望 思路:考虑每连续的n道题 都要n个人来做,显然想到了带权的二分图匹配 然后就是套模板 ...