最长公共字符串 基础DP
2017-04-15 11:27
232 查看
最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。
#include <stdio.h>#include <string.h>#define N 256int f(const char* s1, const char* s2){ int a; int len1 = strlen(s1); int len2 = strlen(s2); int i,j; memset(a,0,sizeof(int)*N*N); int max = 0; for(i=1; i<=len1; i++){ for(j=1; j<=len2; j++){ if(s1[i-1]==s2[j-1]) { a[i][j] =a[i-1][j-1]+1; if(a[i][j] > max) max = a[i][j]; } } } return max;}int main(){ printf("%d\n", f("abcdkkk", "baabcdadabc")); return 0;}
我在想,这道题为什么不用暴力呢,首先声明一下,用DP的时间复杂度是len1*len2,也就是说,如果我是想用暴力的话,那么就必须保证时间复杂度小于等于len1*len2,那好,暴力的话两个for循环再加一个for循环,直接GG,所以DP的时间复杂度低,那么为什么DP的时间复杂度低呢?打个比方吧, 1 2 3 4 5,之前暴力的那个方法是1 2 3 4 5;
2 3 4 5; 3 4 5; 4 5 ; 5; 当然了,这个例子不准确,但可以解释为什么DP的时间复杂度为什么低,再来看DP的,1 2 3 4 5;看!这就是DP的魅力所在,在这里DP的魅力就是记忆,对就是他妈的记忆。O了。
相关文章推荐
- java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度
- DP之钢管切割,最长回文字符串,最长公共子串
- hdu 1159(DP+字符串最长公共序列)
- Dp 基础 最长公共子
- 求两个字符串的最长公共子串(DP实现)
- [SID-EXAM]利用后缀数组求两个字符串的最长公共子串,较dp效率要高
- poj 1226 Substrings 求n个字符串的最长公共子串(这里可以是反序相同) 后缀数组
- VB6求两个字符串最长公共子串的问题
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 获取两个字符串之间最长公共字符串的算法(PHP)
- 利用后缀树求多个字符串的最长公共连续子串(Longest Common Substring)
- 如何求最长连续公共子序列和最长连续子字符串
- 利用后缀数组求字符串的最长重复子串的算法 利用二维数组求两个字符串的最长公共字串(动态规划)
- 求两个字符串的最长公共子串(LCS)
- 求出两个字符串的最长公共子串
- 求最长连续公共子序列和最长连续子字符串
- VB6求两个字符串最长公共子串的问题
- PKU2250 最长公共字串 DP
- 查找两个字符串的最长公共子串的Javascript函数
- 求两个字符串最长公共子串(LCS问题)