华为 oj 公共子串计算
水题,原来以为用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 公共子串计算的更多相关文章
- 华为OJ: 公共字符串计算
有几个需要注意的地方,这个问题是不是大写和小写之间的区别.这样你就输入字符串大写或小写转换的计算前. 第二个,定要清晰.先将s1从[i]处開始与s2的[j]開始匹配,不相等则j++直到j等于s2.le ...
- 华为OJ之最长公共子串
题目描述: 对于两个给定的字符串,给出他们的最长公共子串. 题目分析: 1,最长公共子串(LCS)实际上是最长公共子序列的一种特殊情况,相当于是求连续的最长子序列.我们今天先解决这个特殊情况,后续博文 ...
- 【ZH奶酪】如何用Python计算最长公共子序列和最长公共子串
1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
- 华为OJ2011-最长公共子串
一.题目描述 描述: 计算两个字符串的最大公共子串(Longest Common Substring)的长度,字符区分大小写. 输入: 输入两个字符串 输出: 输出一个整数 样例输入: asdfas ...
- 华为OJ之最长公共子序列
题目描述: 对于两个给定的字符串,给出他们的最长公共子序列. 题目分析: 1,在之前的博文(http://www.cnblogs.com/yonguo123/p/6711360.html)中我们讨论了 ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- lintcode :最长公共子串
题目 最长公共子串 给出两个字符串,找到最长公共子串,并返回其长度. 样例 给出A=“ABCD”,B=“CBCE”,返回 2 注意 子串的字符应该连续的出现在原字符串中,这与子序列有所不同. 解题 注 ...
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...
随机推荐
- alter database open resetlogs
使用resetlogs选项,会把当前的日志序号(log sequence number)重设为1,并抛弃所有日志信息.在以下条件时需要使用resetlogs选项: 在不完全恢复(介质恢复): 使用备份 ...
- IIS上部署网站404错误
新装的系统上部署.net网站遇到403.404错误,可能原因记录: 1.应用程序池选择错误,一般选择4.0的 2.ASP.NET4.0应用程序池未安装(一般先安装了framework4.0,后安装ii ...
- java下DataInputStream与DataOutputStream写入数据的同时写入数据类型
package cn.stat.p2.demo; import java.io.DataInputStream; import java.io.DataOutputStream; import jav ...
- java基础day7
1/匿名类对象:创建类的对象是匿名的. 比如说new Circle():就是一个匿名类对象. 匿名类对象只能使用一次. 2/形参:声明方法时,方法小括号内的参数 实参:调用方法是,实际传入的参数的值 ...
- php打印xml格式数据
在你要输出的xml前边加 header("Content-type:text/xml;charset=utf-8"); 这个上边不要有任何输出 打印用echo 别用va ...
- PYTHON简介及安装
Python简介 Python是一种广泛使用的高层次,通用,解释,动态编程语言.它的设计理念强调代码的可读性,它的语法允许程序员表达更少的代码的概念比将在可能语言如C ++或Java.该语言提供旨在使 ...
- Oracle 序列的应用
Oracle创建序列,删除序列,得到序列 序列的创建 create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999 ...
- 如何监听input的脚本赋值
今天记录下我解决input值改变监听,大家肯定首先想到onchange方法.对于实时监听改变用onpropertychange.oninput等方法:可是,onchange并不能监听脚本改变的值,对于 ...
- iOS开发 masonry 设置tableHeadView
最近做公司项目,使用到到tableHeadView,一直习惯用masonry来设置约束,但是设置tableHeadView没有那么的简单.先看下效果图: 视图层次结构是这样的: 基础的创建工程项目之类 ...
- iOS开发网络数据之AFNetworking使用
iOS开发网络数据之AFNetworking使用 如何选择AFNetworking版本 首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少.AFNetw ...