题目链接

Problem Description

Giving two strings and you should judge if they are matched.

The first string contains lowercase letters and uppercase letters.

The second string contains lowercase letters, uppercase letters, and special symbols: “.” and “”.

. can match any letter, and * means the front character can appear any times. For example, “a.b” can match “acb” or “abb”, “a
” can match “a”, “aa” and even empty string. ( “” will not appear in the front of the string, and there will not be two consecutive “”.

Input

The first line contains an integer T implying the number of test cases. (T≤15)

For each test case, there are two lines implying the two strings (The length of the two strings is less than 2500).

Output

For each test case, print “yes” if the two strings are matched, otherwise print “no”.

Sample Input

3

aa

a*

abb

a.*

abb

aab

Sample Output

yes

yes

no

题意:

给定两个字符串,一个是主串,另一个模拟串,主串中只含有大小写字符,模拟串中除了含有大小写字符外,还有'.'和'','.'可以与主串中的任意的字符匹配,''可以将它前面的一个字符扩展或则删去,问这两个字符串是否能够匹配成功。

分析:

str表示主串,str1表示模拟串,可以假设dp[i][j]表示str1[1,i]与str[1,j]是否匹配。

显然dp[0][0] = true,都没有开始的时候默认是匹配的。

如果 str1[i] == . 或者str1[i] == str[j]时,dp[i][j] 的状态取决于状态dp[i-1][j-1]

如果str1[i] == ‘*‘时,因为这个字符可以可以延伸或则删除前一个 dp[i][j] == dp[i-1][j] | dp[i-2][j],

而当(dp[i-1][j-1] || dp[i][j-1]) && str[j-1] == str[j] 时,dp[i][j]必定为true;

具体的看一下代码把:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 2510;
char str[N], str1[N];
bool dp[N][N];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
memset(dp, false, sizeof(dp));
scanf("%s %s",str+1, str1+1);
int len = strlen(str+1), len1 = strlen(str1+1);
dp[0][0] = true;
for(int i = 1; i <= len1; i ++)
{
if(i == 2 && str1[i] == '*') dp[i][0] = true;///这样的话相当于完全可以将模拟串之前的全部去掉
for(int j = 1; j <= len; j ++)
{
if(str1[i] == '.' || str1[i] == str[j])///模拟串是点或者模拟串与主串的字符相等,匹配与否取决于每个串前一个字符
dp[i][j] = dp[i-1][j-1];
else if(str1[i] == '*')///模拟串是’*‘的话
{
dp[i][j] = dp[i-2][j] | dp[i-1][j];///模拟串看前一个是否与祖串匹配,或则去掉前一个之后是否与祖串匹配
if((dp[i-1][j-1] || dp[i][j-1]) && str[j-1] == str[j])///主串的当前位置与前一个位置相等,只要前面的位置匹配或者
dp[i][j] = true;
}
}
}
printf("%s\n",dp[len1][len]?"yes":"no");
}
return 0;
}

2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 7 1010 HDU 6129 Just do it (找规律)

    题目链接 Problem Description There is a nonnegative integer sequence a1...n of length n. HazelFan wants ...

  2. 2017ACM暑期多校联合训练 - Team 6 1010 HDU 6105 Gameia (博弈)

    题目链接 Problem Description Alice and Bob are playing a game called 'Gameia ? Gameia !'. The game goes ...

  3. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  4. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  5. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  6. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  7. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  8. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

  9. 2017ACM暑期多校联合训练 - Team 7 1009 HDU 6128 Inverse of sum (数学计算)

    题目链接 Problem Description There are n nonnegative integers a1-n which are less than p. HazelFan wants ...

随机推荐

  1. 性能分析_linux服务器CPU_Load Average

    CPU度量Load Average 1.  概念介绍 1.1  Linux系统进程状态 在linux中,process有以下状态: runnable (就绪状态):blocked waiting fo ...

  2. POJ3177_Redundant Paths

    给你一个无向图,求至少加入多少条边,使得整个图是双联通的. 通过枚举题意,发现重边是不算的,直接去掉. 首先把那些边是桥计算出来,把位于同一个连通分量里面的点缩成一个点(并查集),然后计算缩点后有多少 ...

  3. eclispe 出现超内存错误

    刚开始以为只要修改tomcat的最大最小内存就可以,结果还是报错,后来才懂需要在eclipse.ini文件中修改 -Xms256m-Xmx512m的值改大些,增加虚拟机运行的内存空间 刚开始最小值只有 ...

  4. 【CF472G】Design Tutorial: Increase the Constraints

    Description 给出两个01序列\(A\)和\(B\) 要求回答\(q\)个询问每次询问\(A\)和\(B\)中两个长度为\(len\)的子串的哈明距离 ​ 哈明距离的值即有多少个位置不相等 ...

  5. linux系统之定制rpm包

    FPM打包工具 FPM的作者是jordansissel FPM的github:https://github.com/jordansissel/fpm FPM功能简单说就是将一种类型的包转换成另一种类型 ...

  6. 遇到问题----mongodb-----mongorestore报错too many open files甚至mongo服务崩溃

    之前运行mongorestore还原mongodb数据库一直都没问题,今天还原的时候 报错too many open files.而且mongo服务经常崩溃需要重启. 问题有两方面: 原因一 一个原因 ...

  7. 解题:BZOJ 2673 World Final 2011 Chips Challenge

    题面 数据范围看起来很像网络流诶(滚那 因为限制多而且强,数据范围也不大,我们考虑不直接求答案,而是转化为判定问题 可以发现第二个限制相对好满足,我们直接枚举这个限制就可以.具体来说是枚举所有行中的最 ...

  8. 【AC自动机】AC自动机

    Definition & Solution AC自动机是一种多模式串的字符串匹配数据结构,核心在于利用 fail 指针在失配时将节点跳转到当前节点代表字符串的最长后缀子串. 首先对 模式串 建 ...

  9. UVALive 7505 Hungry Game of Ants (2015Ecfinal)

    题意: 长度是n的线段上点的编号从1~n,每个点有一只蚂蚁蚂蚁的体重等于该点的编号,最初每只蚂蚁可以选择向右走或者向左走两只蚂蚁相遇时体重大的吃掉体重小的并且体重增加为两只的体重和,走到边界时掉头,问 ...

  10. 发送邮件 tp5.1 5.0都可以,实测有效

    https://www.cnblogs.com/zhensg123/p/8954175.html 博客文章少了个Expection.php 文件; common.php <?php // 应用公 ...