[DLdigest-11] 每日一道算法

2017 年 11 月 16 日 深度学习每日摘要 DLdigest

这道题是实现字符串的正则表达式匹配,这里只用实现’.’和’*‘的匹配即可。其中,’.’表示任意单一字符,’*’表示0个或多个前一字符。

可以使用动态规划算法来解决这个问题,假设字符串s的长度为m,字符串p的长度为n,可以使用一个状态矩阵state[m+1][n+1]来存储字符串s和字符串p的对应元素的匹配状态,若匹配,则为True,否则,为False。如元素state[i][j]表示字符串s的前i个元素与字符串p的前j个元素是否匹配。

首先,考虑一个特殊状态state[0][0]=True,因为两个空白字符串肯定是匹配的;

对于state[i][0]呢?即p为空白字符串时,无论s是什么,都不匹配,故state[i][0]=False(不包括i=0的情况);

对于其他情况,只用遍历s和p即可,对于任意state[i][j]而言,可以根据p[j-1]的取值为’*’,’.’,以及其他字符来进行讨论:

对于p[j-1]为’*’,可以分为几种情况进行讨论:

对于像s="ab"并且p="abc*"这种情况,只要state[i][j-2]=True即可保证state[i][j]为True,因为p的最后两个元素不影响匹配的结果;

对于像s=”abb”并且p=”ab*“这种情况,如果state[i-1][j]=False,那么state[i][j]一定为False,同时,也应该确保s[i-1]=p[j-2],即避免出现”abc”匹配成”ab*”的情况;

对于像s=”abb”并且p=”a.*”这种情况,因为’.’可以匹配任意单一字符,因此state[i-1][j]唯一决定着state[i][j]的取值;

对于p[j-1]=’.’的时候,例如像s=”ab”并且p=”a.”,state[i][j]只由state[i-1][j-1]来决定;

对于p[j-1]为其他字符的时候,例如像s=”abb”并且p=”a*b”,这个时候不仅需要state[i-1][j-1]为True,而且s[i-1]必须与p[j-1]相等才能得到state[i][j]=True;

将上面的情况综合整理之后,代码如下:

#include<iostream>
using namespace std;
class Solution {
public:    
   bool isMatch(string s, string p) {        
       int m=s.size(), n=p.size();        
       bool state[m+1][n+1];
       for(int i=0; i<=m; i++) {
           for(int j=0; j<=n; j++) {
               if(i==0 && j==0)                    state[i][j]=true;                
               else if(i>0 && j==0)                    state[i][j]=false;                
               else if(j>1 && p[j-1]=='*')                    state[i][j]=state[i][j-2] || (i>0 && (s[i-1]==p[j-2] ||  p[j-2]=='.') && state[i-1][j]);
               else                    state[i][j]=i>0 && state[i-1][j-1] && (p[j-1]=='.' || s[i-1]==p[j-1]);           }        }
       return state[m][n];    } };
       
int main() {    Solution s;
   cout<<boolalpha;
   cout<<s.isMatch("abb", ".b*")<<endl;
   cout<<s.isMatch("abb", "ab*")<<endl;
   cout<<s.isMatch("abb", "ab.")<<endl;
   cout<<s.isMatch("abb", "a.b")<<endl;
   cout<<s.isMatch("abb", "ab")<<endl;
   cout<<s.isMatch("aa", "a")<<endl;
   cout<<s.isMatch("aaa", "aaaa")<<endl;
   return 0; } 程序运行结果:
true
true
true
true
false
false
false


每日一道算法——Container With Most Water
Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and n is at least 2.


近期将以NLP领域论文分享及注意力机制的代码实践为主,每天一道算法会保持更新。欢迎大家留言分享深度学习知识或交流每日一道算法的思路,本期算法的解决方法将在下一期中讲解。

题图:Mona Lisa Sketch Hidden Alien


你可能会感兴趣的文章有:

[DLdigest-10] 每日一道算法

[DLdigest-9] 每日一道算法

[DLdigest-8] 每日一道算法

[DLdigest-7] 每日一道算法

[DLdigest-6] 每日一道算法

[DLdigest-5] 每日一道算法

[DLdigest-4] 每日一道算法

[DLdigest-3] Python中让你无法预测的“是”

[DLdigest-2] AlphaGo Zero是自由的

[DLdigest-1] 有人用量子场论来解释深度神经网络

详解TensorFlow Eager命令式执行环境

动态层归一化(Dynamic Layer Normalization)

端对端的深度卷积神经网络在语音识别中的应用

SampleRNN语音合成模型

详述DeepMind wavenet原理及其TensorFlow实现

Layer Normalization原理及其TensorFlow实现

Batch Normalization原理及其TensorFlow实现

Maxout Network原理及其TensorFlow实现

时延神经网络(TDNN)原理及其TensorFlow实现

ConvLSTM原理及其TensorFlow实现

Network-in-Network原理及其TensorFlow实现

如何基于TensorFlow实现ResNet和HighwayNet

深度学习每日摘要|坚持技术,追求原创

微信ID:deeplearningdigest
长按二维码关注我
登录查看更多
0

相关内容

在数学和计算机科学之中,算法(Algorithm)为一个计算的具体步骤,常用于计算、数据处理和自动推理。精确而言,算法是一个表示为有限长列表的有效方法。算法应包含清晰定义的指令用于计算函数。 来自维基百科: 算法
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
专知会员服务
139+阅读 · 2020年5月19日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
354+阅读 · 2020年2月15日
2019年机器学习框架回顾
专知会员服务
35+阅读 · 2019年10月11日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
LeetCode的C++ 11/Python3 题解及解释
专知
16+阅读 · 2019年4月13日
AI 玩跳一跳的正确姿势,跳一跳 Auto-Jump 算法详解
Python开发者
5+阅读 · 2018年1月16日
关关的刷题日记90 – Leetcode 400. Nth Digit
专知
3+阅读 · 2018年1月8日
【关关的刷题日记60】Leetcode 437. Path Sum III
【 关关的刷题日记53】 Leetcode 100. Same Tree
专知
10+阅读 · 2017年12月1日
【 关关的刷题日记47】Leetcode 38. Count and Say
[DLdigest-8] 每日一道算法
深度学习每日摘要
4+阅读 · 2017年11月2日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Arxiv
3+阅读 · 2018年12月19日
Music Transformer
Arxiv
5+阅读 · 2018年12月12日
Arxiv
5+阅读 · 2018年1月23日
VIP会员
相关VIP内容
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
专知会员服务
139+阅读 · 2020年5月19日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
354+阅读 · 2020年2月15日
2019年机器学习框架回顾
专知会员服务
35+阅读 · 2019年10月11日
机器学习入门的经验与建议
专知会员服务
92+阅读 · 2019年10月10日
相关资讯
LeetCode的C++ 11/Python3 题解及解释
专知
16+阅读 · 2019年4月13日
AI 玩跳一跳的正确姿势,跳一跳 Auto-Jump 算法详解
Python开发者
5+阅读 · 2018年1月16日
关关的刷题日记90 – Leetcode 400. Nth Digit
专知
3+阅读 · 2018年1月8日
【关关的刷题日记60】Leetcode 437. Path Sum III
【 关关的刷题日记53】 Leetcode 100. Same Tree
专知
10+阅读 · 2017年12月1日
【 关关的刷题日记47】Leetcode 38. Count and Say
[DLdigest-8] 每日一道算法
深度学习每日摘要
4+阅读 · 2017年11月2日
相关论文
Top
微信扫码咨询专知VIP会员