#include <iostream>
#include <algorithm>
using namespace std;
#define N 12
#define M 6
int D[20][20]; // 填表矩阵设置为全局变量
int f[20][20]; // 1从左边来的,2从上面来的,3从左上来的
char P[6] = {' ','h','a','p','p','y'};
char T[12] = {' ','A',' ','h','a','p','s','y',' ','d','a','y'};
//int min(int a,int b,int c)
//{
// int x[] = {a, b, c};
// sort(x, x+3);
// return x[0];
//}
int min(int a, int b, int c)
{
if (a <= b && a <= c)
{
return a;
}
if (b <= a && b <= c)
{
return b;
}
if (c <= a && c <= b)
{
return c;
}
}
//输出备忘录、标记数组,使用备忘录法
void ASM(char P[],int m,char T[],int n)
{
// 初始化第 0行
// for(int j=1;j <= n;j++) D[0][j] = 0;
// 初始化第 0列
for(int i=1;i <= m;i++) D[i][0] = i;
for(int i=1;i <= m;i++){
for(int j=1;j <= n;j++){
if(P[i] == T[j]) {
D[i][j] = min(D[i-1][j-1], D[i-1][j]+1, D[i][j-1]+1);
if(D[i-1][j-1] == min(D[i-1][j-1], D[i-1][j]+1, D[i][j-1]+1))
f[i][j] = 3;
else if(D[i-1][j] == min(D[i-1][j-1], D[i-1][j]+1, D[i][j-1]+1))
f[i][j] = 2;
else
f[i][j] = 1;
}
else {
D[i][j] = min(D[i-1][j-1]+1, D[i-1][j]+1, D[i][j-1]+1);
if(D[i-1][j-1]+1 == min(D[i-1][j-1]+1, D[i-1][j]+1, D[i][j-1]+1))
f[i][j] = 3;
else if(D[i-1][j]+1 == min(D[i-1][j-1]+1, D[i-1][j]+1, D[i][j-1]+1))
f[i][j] = 2;
else
f[i][j] = 1;
}
}
}
cout << "备忘录如下\n";
for(int i = 0;i <= m;i++){
for(int j = 0;j <= n;j++){
cout << D[i][j] << ' ';
}
cout << '\n';
}
cout << "标记数组如下\n";
for(int i = 0;i <= m;i++){
for(int j = 0;j <= n;j++){
cout << f[i][j] << ' ';
}
cout << '\n';
}
}
void PS(int i) {
cout << "T 中与 P 呈 " << i << "-近似串匹配的所有子串是:" << endl;
for(int k = 0; k <= 11; k++) {
if(D[5][k] == i) {
for (int j = k - 4; j <= k; j++) {
cout << T[j];
}
cout << endl;
}
}
}
int main(){
ASM(P,5,T,11);
PS(1);
PS(2);
PS(4);
return 0;
}
05-29