字符串 通配符匹配

问题描述:

  • 通配符匹配通配符 ?   表示可以替换一个任意字符
  • 通配符 *   表示可以替换一个 长度任意的字符串 或者替换空

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;
	
}


 

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/87975655