最大子串匹配
2013-01-23 16:42
162 查看
//最大子串匹配,复杂度O(mn)
//返回最大匹配值,传入两个串和串的长度,重载返回一个最大匹配
//注意做字符串匹配是串末的'\0'没有置!
//可更改元素类型,更换匹配函数和匹配价值函数
//返回最大匹配值,传入两个串和串的长度,重载返回一个最大匹配
//注意做字符串匹配是串末的'\0'没有置!
//可更改元素类型,更换匹配函数和匹配价值函数
#include <string.h> #define MAXN 100 #define max(a,b) ((a)>(b)?(a):(b)) #define _match(a,b) ((a)==(b)) #define _value(a,b) 1 typedef char elem_t; 122 int str_match(int m,elem_t* a,int n,elem_t* b){ int match[MAXN+1][MAXN+1],i,j; memset(match,0,sizeof(match)); for (i=0;i<m;i++) for (j=0;j<n;j++) match[i+1][j+1]=max(max(match[i][j+1],match[i+1][j]), (match[i][j]+_value(a[i],b[i]))*_match(a[i],b[j])); return match[m] ; } int str_match(int m,elem_t* a,int n,elem_t* b,elem_t* ret){ int match[MAXN+1][MAXN+1],last[MAXN+1][MAXN+1],i,j,t; memset(match,0,sizeof(match)); for (i=0;i<m;i++) for (j=0;j<n;j++){ match[i+1][j+1]=(match[i][j+1]>match[i+1][j]?match[i][j+1]:match[i+1][j]); last[i+1][j+1]=(match[i][j+1]>match[i+1][j]?3:1); if ((t=(match[i][j]+_value(a[i],b[i]))*_match(a[i],b[j]))>match[i+1][j+1]) match[i+1][j+1]=t,last[i+1][j+1]=2; } for (;match[i][j];i-=(last[t=i][j]>1),j-=(last[t][j]<3)) ret[match[i][j]-1]=(last[i][j]<3?a[i-1]:b[j-1]); return match[m] ; }
相关文章推荐
- 算法--最大相同子串匹配
- 匹配两个字符串的最大子串
- 最大子串匹配
- 最大匹配字符子串 深度优先
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 在KMP基础上添加最大子串匹配功能
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 二分图最大匹配算法-Hopcroft-Karp模板
- 练习二 将字符串反转 练习三 获取关键字出现的次数 练习四 获取2个字符串中最大公共子串
- hdu 1179最大匹配
- hdu5285黑白染色二分最大匹配
- hdu 2444(二分图的判断以及求最大匹配)
- 二分图最大匹配的König定理及其证明
- 字符串的最大相似匹配
- hdu 4687 带花树求一般图最大匹配(模板)
- 求最大二分匹配(模板)
- POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
- POJ 3041 Asteroids(最大二分匹配)
- 51nod 1368:黑白棋 二分图最大匹配
- HDU 2413 & POJ 3343 Against Mammoths【最大匹配+二分】