zoukankan      html  css  js  c++  java
  • Regular Expression Matching

    用动态规划

    思想是:每次计算后都保存当前的运行结果

    f[i][j]表示串s[0···i-1]与从串p[0···j-1]的比较结果

    首先,f[0][0]表示两空串比较结果为真    f[0][0]=true;

    其次,当原串不为空时,无论p串是什么结果都为真,即f[i][0]=false;  而当原串为空时,需考虑p串的p[j-1]是否等于‘*’,当等于时再考虑p[j-3]是否已经与空串比较为真即f[0][j-2]

    最后,以上是边界条件,真个过程中通过判断p[j-1]是否为‘*’,分为两种情况:

                                                                          否:比较简单,直接比较p[j-1]与s[i-1],或者p[j-1]为'.',注意还要加上之前f[i-1][j-1]

                                                                          是:第一种,s[i-1]已与p[j-3]前面的串都相同,则f[i][j-2]就可以了;第二种,判断s[i-1]与p[j-2]比较相同,再加上之前的串f[i-1][j]

     1 class Solution {
     2 public:
     3     bool  isMatch(string s, string p){
     4      int lens=s.length();
     5      int lenp=p.length();
     6      vector<vector<bool>> f(lens+1,vector<bool>(lens,false));
     7      f[0][0]=true;
     8      for(int i=1;i<=lens;i++)
     9          {
    10             f[i][0]=false;
    11          }
    12      for(int j=1;j<lenp;j++)
    13          {
    14            f[0][j]=j>1&&p[j-1]=='*'&&f[0][j-2];
    15          }
    16      for(int i=0;i<lens;i++)
    17          for(int j=0;j<lenp;j++)
    18              {
    19                if(p[j-1]!='*')
    20                    {
    21                        f[i][j]=f[i-1][j-1]&&(p[j-1]==s[i-1]||p[j-1]=='.');
    22                    }
    23                else
    24                    f[i][j]=f[i][j-2]||(s[i-1]==p[j-2]||'.'==p[j-2])&&f[i-1][j];
    25              }
    26     }
    27 };
  • 相关阅读:
    23.java方法的深入
    MapReduce:详解Shuffle过程
    Hadoop1.x与Hadoop2的区别
    进程控制的一些api
    程序的静态链接,动态链接和装载
    用户级线程和内核级线程的区别
    从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)
    海量处理面试题
    面试中的二叉树题目
    linux 进程间消息队列通讯
  • 原文地址:https://www.cnblogs.com/daocaorenblog/p/5214261.html
Copyright © 2011-2022 走看看