带通配符的字符串匹配 2020/12/2
#include<iostream>
#include<string>
using namespace std;
bool dp[30][30] = {};
int main()
{
string s1, s2;
cin >> s1 >> s2;
int n1 = s1.size();
int n2 = s2.size();
dp[0][0] = true;
int i = 0, j = 0;
for (int i = 0; i < n1; i++)
{
if (s1[i] != '*')
{
break;
}
if (i == n1 - 1 && s1[i] == '*')
{
cout << "matched";
return 0;
}
}
for (i = 1; s1.at(i - 1) == '*'; i++) // 第二行可能会是空字符串,空字符串可以与任意多的*匹配
{
dp[i][0] = true;
}
for (i = 1; i <= n1; i++)
{
for (j = 1; j <= n2; j++)
{
if (s1.at(i - 1) == '*' && (dp[i - 1][j - 1] || dp[i][j - 1] || dp[i - 1][j]))
// dp[i-1][j-1]对应*匹配到的第一个字符
// dp[i][j-1]对应*匹配到的第二个以后的字符
// dp[i-1][j]对应*匹配到空字符
{
dp[i][j] = true;
}
else if (s1.at(i - 1) == '?' && dp[i - 1][j - 1])
{
dp[i][j] = true;
}
else if (s1.at(i - 1) == s2.at(j - 1) && dp[i - 1][j - 1])
{
dp[i][j] = true;
}
}
}
if (dp[n1][n2])
{
cout << "matched";
}
else
{
cout << "not matched";
}
return 0;
}