题解 | #字符串通配符#

字符串通配符

http://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036

使用动态规划
1.dp[0][0]=1,空串和空串匹配
1.串首的*可以和空串匹配,串首为*,dp[i][0]=1;
2.*时(*可以匹配0个或无限个合法字符),即为左边和上边的最大值,左边:用*继续做匹配;上边:忽略*
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
3.?时(只能匹配一个合法字符,且不能忽略?)
dp[i][j]=dp[i-1][j-1];
4.字符相等时
dp[i][j]=dp[i-1][j-1];
5.其他不满足上述条件的,dp[i][j]=0;

总代码:
/*HJ71 字符串通配符
动态规划
dp[i][j] pattern前i个,string前j个
*/
#include <iostream>
using namespace std;
int main()
{
    string pattern;
    string str;
    int dp[100][100]={0};
    cin>>pattern;
    cin>>str;
	dp[0][0]=1;    
	for(int i=0;i<pattern.length();i++)//全部转换为小写字母 
	{
		if(pattern[i]>='A'&&pattern[i]<='Z') pattern[i]=pattern[i]-'A'+'a';
	}
	for(int i=0;i<str.length();i++)
	{
		if(str[i]>='A'&&str[i]<='Z') str[i]=str[i]-'A'+'a';
	}
    for(int i=1;pattern[i-1]=='*';i++) //串首的*可以跟空串匹配 
    {
    	dp[i][0]=1;
	}
	for(int i=1;i<=pattern.length();i++)//dp数组更新 
    for(int j=1;j<=str.length();j++)
    {
    	if(pattern[i-1]=='*') 
            dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//dp[i-1][j]:忽略*,dp[i][j-1]:用*做匹配该字符 (注意*可以匹配0个或者多个字符)
		else if(pattern[i-1]=='?'&&(str[j-1]>='0'&&str[j-1]<='9'||str[j-1]>='a'&&str[j-1]<='z')) 
			dp[i][j]=dp[i-1][j-1];
		else if(pattern[i-1]==str[j-1])
			dp[i][j]=dp[i-1][j-1];			
	}
//    for(int i=1;i<=pattern.length();i++)//dp数组打印 
//    {
//    	cout<<pattern[i-1];
//    	for(int j=1;j<=str.length();j++)
//    	{
//			cout<<dp[i][j]<<" ";   	
//		}
//    	cout<<endl;
//	}
    if(dp[pattern.length()][str.length()])
	cout<<"true"<<endl;
    else cout<<"false"<<endl;
    
}


全部评论

相关推荐

双非一本失业第二年:《机器视觉垃圾分类》
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务