• [LeetCode]题解(python):010-Regular Expression Matching


     

    题目来源:

    https://leetcode.com/problems/regular-expression-matching/


    题意分析:

         这道题目定义了两个正则表达式规则。’.’代表任意字符,’*’代表前一个字符出现任意次。输入两个字符串s,p。如果s可以被p完全匹配则返回True,否则返回False。比如’.*’可以匹配任意字符串。


    题目思路:

         这道题目如果直接import 正则表达式肯定是不行的,因为题目只定义了2个特殊字符,而正则表达式包括很多特殊字符,所以直接import正则表达式肯定是不行的

         从第一个字符开始搜索,对以下情况进行讨论:

    ①如果(s[0] == p[0]or p[0] == ‘.’)且p的第二个字符不是’*’,那么如果两个字符同时去掉第一个字符,结果不变。

    ②如果p[0] == ‘.’且p[1] == ‘*’那么如果存在s[i:],i >= 0被p[2:]完全匹配,则s可以被p完全匹配(s[i:]代表s字符除掉0到i下标的字符)。

    ③如果p[0] != ‘.’且p[1] == ‘*’,那么如果s[0] != p[0]那么如果s可以被p[2:]匹配,则s可以被p完全匹配。

    ④如果s[0] == p[0]那么如果存在s[i:](i >= 0 且 s[j] == p[0] 0<= j <i)被p[2:]完全匹配,那么s可以被p完全匹配。

         经过上面的分析,这道题目可以用动态规划来做。用b[i][j]来代表由s除掉0到i下标的字符能否被由p除掉0到j下标的字符完全匹配,也就是s[i:]能否被p[j:]完全匹配。根据上一段的分析可以得到:

           if p[j + 1] != ‘*’    

                  if s[i] == p[j] or p[j] == ‘.’ then b[i][j] = b[i + 1][j + 1]

                  fi

           else

                  if p[j] == ‘.’ then

                       if exist k (i<=k) b[k][j + 2] = true then b[i][j] = true

                       else b[i][j] = false

                       fi

                 else

                      if exist k(i <= k)b[k][j + 2] = true and all l (0 <= l <k) s[l] = p[0] then b[i][j] =true

                      else b[i][j] = false

                      fi

          fi

          return b[0][0]

    PS:由于python的二维数组初始化比较麻烦,或者是因为我对python的不熟,我选择用dictionary来处理,b[i,j]代替b[i][j].


     

    代码(python):

     1 class Solution(object):
     2     def isMatch(self,s, p):
     3         size1 = len(s)
     4         size2 = len(p)
     5         b = {}
     6         s1 = 0
     7         while s1 <= size1:
     8             s2 = 0
     9             while s2 <= size2:
    10                 b[s1,s2] = False
    11                 s2 += 1
    12             s1 += 1
    13         b[size1,size2] = True
    14         j = size2 - 1
    15         while j >= 0:
    16             if p[j] == '*':
    17                 b[size1,j] = False
    18                 j -= 1
    19                 b[size1,j] = True
    20                 j -= 1
    21             else:
    22                 break
    23         j = size2 - 1
    24         while j >= 0:
    25             if p[j] == '.':
    26                 i = size1 - 1
    27                 while i >= 0:
    28                     b[i,j] = b[i + 1,j + 1]
    29                     i -= 1
    30             elif p[j] != '*':
    31                 i = size1 - 1
    32                 while i >= 0:
    33                     if p[j] == s[i]:
    34                         b[i,j] = b[i + 1,j + 1]
    35                     else:
    36                         b[i,j] = False
    37                     i -= 1
    38             else:
    39                 i = size1 - 1
    40                 if p[j - 1] == '.':
    41                     while i >= 0:
    42                         k = i
    43                         while k <= size1:
    44                             if b[k,j + 1]:
    45                                 b[i,j - 1] =True
    46                                 break
    47                             k += 1
    48                         i -= 1
    49                 else:
    50                     while i >= 0:
    51                         k = i
    52                         while k <= size1:
    53                             if b[k,j + 1]:
    54                                 b[i,j - 1] = True
    55                                 break
    56                             if k == size1:
    57                                 break
    58                             if p[j - 1] != s[k]:
    59                                 break
    60                             k +=1
    61                         i -= 1
    62                 j -= 1
    63             j -= 1
    64         return b[0,0]
    View Code

    转载请注明出处:http://www.cnblogs.com/chruny/p/4807234.html

  • 相关阅读:
    【C语言程序设计】C语言渔夫打鱼晒网问题!
    【C语言】很少人真正了解 和 有什么区别!
    【C语言程序设计】C语言求亲密数!
    新手程序员该如何打造自己的个人品牌!谨记,共勉!
    【C语言程序设计】利用数组解决线性代数中的矩阵转置问题!
    【程序员段子】程序员太苦逼了,苍天啊!请给我一次重新择业的机会吧!
    27. Remove Element
    Leetcode Scratching Recorder
    Activity---弹出右侧窗口
    ViewPageIndicator--仿网易的使用
  • 原文地址:https://www.cnblogs.com/chruny/p/4807234.html
Copyright © 2020-2023  润新知