http://acm.hdu.edu.cn/showproblem.php?pid=6170

题目大意:

给出两个字符串s1和s2(长度小于等于2500)。

s1是一个正常的包含大小写字母的字符串,s2是一个类似正则表达式的字符串,除了大小写字母,还有 " . " 和 " * " 两种符号。

" . " 表示可以匹配任意一个字母。

" * ”表示前一个字符可以重复出现任意次(包括零)。

解题思路:

一道标准的dp O(n^2)。

用dp[i][j]来表示s2的前i个字符和s1的前j个字符能否匹配。

对于s2的每一个字符都跑一遍s1的全部字符dp,分别会遇到以下几种情况:

1.s2的该字符是 " * ",而且恰好是第二个字符,那么建立dp起点,也就是dp[i][0]=1;

2.s2的该字符是 " . ",那么说明s2的第j个字符匹配s1的第i个字符成立,dp[i][j]=dp[i-1][j-1];

3.s2的该字符是 " * ",而且不是第二个字符,那么首先考虑到的情况是 * 前一个字符出现0次的情况,所以至少有dp[i][j]=max(dp[i-2][j],dp[i-1][j]);

这种情况举例可以是 s1: abb   s2: abbc*   dp[i][j]=dp[i-2][j]

4.在第3个情况的前提,在 * 对应的前一个字符可能出现非零次时,如果 * 之前的字符都能全部匹配好: dp[i][j-1]==1 而且s1的第j个字符重复了: s1[j]==s1[j-1]的情况下,举例: s1: abbcccc   s2: abbc*

那么很显然只要判断 s2[i-1]==s1[j]成立 或者 s2[i-1]=='.' ,这两个满足任意一个都说明 " * "成功匹配到s1的第j个字符。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<bitset>
#include<functional> using namespace std; #define LL long long
const int INF = 0x3f3f3f3f; int dp[2505][2505];
char s1[2505],s2[2505]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1+1,s2+1);
memset(dp,0,sizeof(dp));
int len1=strlen(s1+1),len2=strlen(s2+1);
dp[0][0]=1;
for(int i=1;i<=len2;i++)
{
if(s2[i]=='*'&&i==2) dp[i][0]=1;
for(int j=1;j<=len1;j++)
{
if(s2[i]=='.') dp[i][j]=dp[i-1][j-1];
else if(s2[i]!='*')
{
if(s2[i]==s1[j]) dp[i][j]=dp[i-1][j-1];
}
else
{
dp[i][j]=max(dp[i-2][j],dp[i-1][j]);
if(dp[i][j-1]&&s1[j]==s1[j-1])
{
if(s2[i-1]==s1[j] || s2[i-1]=='.') dp[i][j]=1;
}
}
}
}
if(dp[len2][len1])
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
 

HDU 6170 Two strings( DP+字符串匹配)的更多相关文章

  1. 2017多校第9场 HDU 6170 Two strings DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...

  2. hdu 6170 Two strings dp

    Two strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Prob ...

  3. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  4. HDU 1711(KMP)字符串匹配

    链接  HDU 1711 Number Sequence KMP 算法 我以自己理解写的,写的不对,不明白的地方海王子出来,一起共同学习: 字符串匹配 就是KMP,一般思想,用一个for循环找开头   ...

  5. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  6. HDU 6170 Two strings (dp)

    /** * 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 * 字符串match, '.'代表匹配任意一个字符,"*" 代表 ...

  7. HDU 1247 Hat’s Words (字符串匹配,暴力)

    题意: 给出一堆单词,如果有一个单词可以分成左右串两个单词,并且在所给的一堆单词中存在,就是hat词,统计所有这样的词,并按字典序输出. 思路: 注意定义,一个hat词可以被两部分已经存在的词组成,那 ...

  8. HDU 5716 带可选字符的多字符串匹配(ShiftAnd)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5716 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  9. HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)

    HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...

随机推荐

  1. MongoDB 批量插入和循环插入性能测试

    一万条数据批量插入和循环插入 循环插入 var startTime = (new Date()).getTime() var db = connect('log') for(var i = 0;i&l ...

  2. system V信号量和Posix信号量

    一.函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量.它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线.例如,应该是sem ...

  3. STM32启动代码分析及其汇编学习-ARM

    STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...

  4. MySQL5.6忘记root密码

    第一步 修改 /etc/my.conf 文件 添加 skip-grant-tables 到 [mysqld] 下面就可以 这个参数的意思是设置为无需密码验证的登录 登录之后,可以添加用户,可以修改密码 ...

  5. SpringBoot开发二十三-统一记录日志

    统一记录日志 AlphaAspect package com.nowcoder.community.aspect; import org.aspectj.lang.ProceedingJoinPoin ...

  6. Linux sudo权限提升漏洞CVE-2021-3156 POC及复现过程

    漏洞简介 2021年1月26日,国外研究团队披露了sudo 中存在的堆溢出漏洞(CVE-2021-3156).利用该漏洞,非特权账户可以使用默认的sudo配置主机上获取root权限,该漏洞影响1.8. ...

  7. C#给线程传递数据

    目录 0. 前情说明 1. ParameterizedThreadStart类型的委托 2. 使用自定义类 3. 使用Lambda表达式 4. 参考以及文中源代码下载 shanzm-2021年8月24 ...

  8. 【现学现卖】python小爬虫

    1.给小表弟汇总一个院校列表,想来想去可以写一个小爬虫爬下来方便些,所以就看了看怎么用python写,到了基本能用的程度,没有什么特别的技巧,大多都是百度搜的,遇事不决问百度啦 2.基本流程就是: 用 ...

  9. java小白困惑的那些事

    刚接触java时,有些技术盲区,查了很多资料也得不到答案,面试时也得遮遮掩掩,这里就列举一些,当年踩过的那些坑 1.http -> https一个网站或接口,从http改到https是否需要额外 ...

  10. git flow版本

    feature 分支:开发者进行功能开发的分支. develop 分支:对开发的功能进行集成的分支. release 分支:负责版本发布的分支. hotfix 分支:对线上缺陷进行修复工作的分支,热修 ...