NC122题解 | #正则表达式匹配#

正则表达式匹配

http://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4

解法

  • 根据动态规划
  • 设置一个dp[m+1][n+1]的布尔数组,表示str的前m个字符与pattern的前n个字符是否匹配
  • dp[0][0]初始化为true
  • dp[0][]初始化:
		for(int i = 1; i <= n; i++){
            if(pattern[i-1] == '*'){
                dp[0][i] = dp[0][i-2];
            }
        }

循环遍历匹配:由短到长 分三种情况:

  • 1、最后一个字符相等str:aaa 与 pattern:cddda
  • 2、最后一个字符是'.'
  • 3、最后一个字符是'*':
此时前一个字符有3种情况:
	(1)前一个字符相等
	(2)前一个字符是'.'
	(3)前一个字符不是以上(无连续*) 
  • 4、最后一个字符不是以上情况:fasle
		for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                if(pattern[j-1] == str[i-1]){
                    dp[i][j] = dp[i-1][j-1];
                }else if(pattern[j-1] == '.'){
                    dp[i][j] = dp[i-1][j-1];
                }else if(pattern[j-1] == '*'){
                    if(pattern[j-2] == str[i-1]){
                    	//也可以写成dp[i][j] = dp[i][j-2] || dp[i][j-1] ||dp[i-1][j];
                        dp[i][j] |= dp[i][j-2];//0次
                        dp[i][j] |= dp[i][j-1];//1次
                        dp[i][j] |= dp[i-1][j];//多次
                    }else if(pattern[j-2] == '.'){
                    	//也可以写成dp[i][j] = dp[i][j-2] || dp[i][j-1] ||dp[i-1][j];
                        dp[i][j] |= dp[i][j-2];//0次
                        dp[i][j] |= dp[i][j-1];//1次
                        dp[i][j] |= dp[i-1][j];//多次
                    }else{
                        dp[i][j] = dp[i][j-2];
                    }
                }else{
                    dp[i][j] =false;
                }
            }
        }
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-20 20:30
工作没了,落户没了,什么都没了
梦想是成为七海千秋:是因为什么原因呀,如果是因为导师恶意卡你就和他爆了
点赞 评论 收藏
分享
粗心的熊熊求求offer:什么内容都没有还弄两页
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务