首页 > 试题广场 >

字符串通配

[编程题]字符串通配
  • 热度指数:4184 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对于字符串A,其中绝对不含有字符’.’和’*’。再给定字符串B,其中可以含有’.’或’*’,’*’字符不能是B的首字符,并且任意两个’*’字符不相邻。exp中的’.’代表任何一个字符,B中的’*’表示’*’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。

给定两个字符串AB,同时给定两个串的长度lenalenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于300。

测试样例:
"abcd",4,".*",2
返回:true
# -*- coding:utf-8 -*-
#dp[i][j] 代表str1[0~i-1]和str2[0~j-1]是否匹配
#首先考虑特殊情况:
    #dp[0][0] = true;空串和空串认为是匹配的
    #dp[0][j] = false;
    #dp[i][0] = false;
#一般情况:
    #1) 如果str2[j-1] == '*'
        #dp[i][j] = dp[i-1][j] || dp[i][j-1] || dp[i-1][j-1]
    #2)  如果str2[j-1] == '.'
        #dp[i][j] = dp[i-1][j-1];
    #3)  如果str2[j-1]为其他值
        #dp[i][j] = dp[i-1][j-1] && str1[i-1] == str2[j-1]
        
class WildMatch:
    def chkWildMatch(self, A, lena, B, lenb):
        dp=[[0 for i in range(lenb+1)]for i in range(lena+1)]
        dp[0][0]=True
        for i in range(1,lena+1):
            for j in range(1,lenb+1):
                if B[j-1]=='*':
                    dp[i][j]=dp[i-1][j] or dp[i][j-1] or dp[i-1][j-1]
                elif B[j-1]=='.':
                    dp[i][j]=dp[i-1][j-1]
                else:
                    dp[i][j]=dp[i-1][j-1] and A[i-1]==B[j-1]
        return dp[lena][lenb]

发表于 2018-09-24 14:25:49 回复(0)

python解法,使用re模块:

import re
class WildMatch:
    def chkWildMatch(self, A, lena, B, lenb):
        def fullmatch(regex, string, flags=0):
            return re.match("(?:" + regex + r")\Z", string, flags=flags)
        if fullmatch(B,A):
            return True
        return False
编辑于 2017-09-12 14:18:46 回复(1)
# -*- coding:utf-8 -*-

class WildMatch:
    def chkWildMatch(self, A, lena, B, lenb):
        # write code here
        import re
        if re.match(B,A) is not None:
            return True
        else:
            return False
发表于 2017-07-15 12:18:48 回复(0)

问题信息

难度:
3条回答 14175浏览

热门推荐

通过挑战的用户

查看代码