问题描述:
- 通配符匹配通配符 ? 表示可以替换一个任意字符
- 通配符 * 表示可以替换一个 长度任意的字符串 或者替换空
a*b? 可以匹配: acdbfdbf abc 现给定通配字符串s1 判断s2 是否满足匹配
思路:采用动态规划 dp[i][j]表示S1前i长度部分与S2前j部分是否匹配
对于dp[i][j]
- ——s1[i]为*表示,该处可以为任意字符串 那么dp[i-1][j]=true 或者 dp[i][j-1]=true都可以使得 dp[i][j]=true匹配上
- ——s1[i]为?表示,该处可以为一个字符串,该问题化归为判断之前的dp[i-1][j-1]=true 是否匹配 因为?可以通配s2[j]
- ——s1[i]为普通字符,那么问题化归为判断之前的dp[i-1][j-1] 以及s1[i]==s2[j]是否匹配
bool m[100][100];
//dp数组 m[i][j]记录s1的前i段与s2的前j段是否匹配
//显然问题所求为m[s1.length][s2.length]
char s1[100];
char s2[100];
void fun()
{
m[0][0] = 1;
//遍历
for(int i=1;i<=str1.length();i++)
for (int j = 1; j <=str2.length(); j++)
{
if (s1[i] == '*') //如果在i位置遇到通配符 *
{
//若*出现在s1第一个位置 那么 m[1][0]=1 即 * 代表空
if (i == 1)
m[1][0] = 1;
m[i][j] = m[i - 1][j] | m[i][j - 1];
}
else if (s1[i] == '?') //如果在i位置遇到通配符 ?
m[i][j] = m[i - 1][j - 1];
else
m[i][j] = (m[i - 1][j - 1]) && (s1[i] == s2[j]);
}
//时间复杂度: O(L1*L2)
//循环结束 所求即为 m[L1][L2]
cout << m[str1.length()][str2.length()] << endl;
}