Problem B. Patterns Overlap Google Kickstart Round A 2017

这一题比赛的时候试图暴力结果还WA了。正解是用DP, dp[i][j]表示第一个字符串s1前i位和第二个字符串s2前j位是否匹配。如果当前状态[i,j]不匹配,那么也无法向后转移到匹配的状态。

如果[i,j]匹配且s1[i+1]==s2[j+1],那么[i+1,j+1]也匹配。

如果[i,j]匹配且s1[i+1]=='*',那么[i+1,j],[i+1,k]匹配,k是j+1及其之后4个非*的字符。必须排除*是因为*可能是空字符。

如果[i,j]匹配且s2[j+1]=='*',那么[i,j+1],[k,j+1]匹配,k是i+1及其之后4个非*的字符。

开始出错是因为这里的状态转移不一定相邻的index转移的。并不能由dp[i-1][j-1]==1直接的出dp[k][j]=1。例如shakes和*,在第一次循环中得出shak与*匹配,之后再循环到pair(e,*)时,就会因为(k,*)匹配而认为(e,*)匹配。

 

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>

using namespace std;

//2018 Round A Problem B large data
int T;
const int maxn=2010;
string s1;
string s2;
int dp[maxn][maxn];
void solve()
{
    dp[0][0]=1;
    for(int i=0;i<s1.length();i++)
    {
        for(int j=0;j<s2.length();j++)
        {
            if(dp[i][j]==0) continue;
            if(s1[i+1]==s2[j+1]&&s1[i+1]!='*'&&s2[j+1]!='*')
            {
                dp[i+1][j+1]=1;
            }
            if(s1[i+1]=='*')
            {
                int cnt=0;
                int k=j;
                while(cnt<4&&k<s2.length())
                {
                    if(k>j&&s2[k]!='*')
                    {
                        cnt++;
                    }
                    dp[i+1][k]=1;
                    k++;
                }
            }
            if(s2[j+1]=='*')
            {
                int cnt=0;
                int k=i;
                while(cnt<4&&k<s1.length())
                {
                    if(k>i&&s1[k]!='*')
                    {
                        cnt++;
                    }
                    dp[k][j+1]=1;
                    k++;
                }
            }
        }
    }
//    for(int i=0;i<s1.length();i++)
//    {
//        for(int j=0;j<s2.length();j++)
//        {
//            cout<<dp[i][j]<<" ";
//        }
//        cout<<endl;
//    }
}
int main()
{
//    char s[maxn];
//    scanf("%s",s+1);
//    cout<<strlen(s+1)<<" "<<strlen(s)<<endl;
    freopen("B-large-practice.in","r",stdin);
//    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    scanf("%d",&T);
    for(int ca=1;ca<=T;ca++)
    {
        memset(dp,0,sizeof(dp));
        cin>>s1>>s2;
        s1="A"+s1;
        s2="A"+s2;
        solve();
        printf("Case #%d: %s\n",ca,dp[s1.length()-1][s2.length()-1]==1?"TRUE":"FALSE");
    }
    return 0;
}
//WA: q* q; q* qabc****d; q*e qabc*de

小数据dfs暴力代码如下。WA就是因为对于s1[i]=*时,直接枚举s2[j] to s2[j+4],没有排除s2[j+k]='*'的字符。另一处是dfs终点,如果其中一个字符串达到末尾,另一个字符还剩下不超过4个non-* character就返回true。

 

 

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<set>

using namespace std;

//2018 Round A Problem B small data
int T;
const int maxn=2010;
char s1[maxn];
char s2[maxn];
bool dfs(int x,int y)
{
//    cout<<x<<" "<<y<<endl;
//    if(x>=strlen(s1)&&y>=strlen(s2))
//    {
//        return false;
//    }
   // cout<<x<<" "<<strlen(s1)-1<<s1[x]<<endl;
    if(x==strlen(s1)-1&&y==strlen(s2)-1)
    {
        if(s1[x]=='*'||s2[y]=='*'||s1[x]==s2[y])
        {
            return true;
        }
        return false;
    }

    if(x==strlen(s1)-1&&s1[x]=='*')
    {
       // cout<<s1[x]<<" "<<y<<" "<<endl;
        if(y+4>=strlen(s2))
        {
            return true;
        }
        else
        {
            int cnt=strlen(s2)-y;
            for(int i=y;i<strlen(s2);i++)
            {
                if(s2[i]=='*')
                {
                    cnt--;
                }
            }
            if(cnt<=4)
            {
                return true;
            }
        }
        return false;
    }
    if(y==strlen(s2)-1&&s2[y]=='*')
    {
        if(x+4>=strlen(s1))//can not use x>=strlen(s1)-4, the type of strlen is not int
        {
            return true;
        }
        else
        {
            int cnt=strlen(s1)-x;
            for(int i=y;i<strlen(s1);i++)
            {
                if(s1[i]=='*')
                {
                    cnt--;
                }
            }
            if(cnt<=4)
            {
                return true;
            }
        }
        return false;
    }
    bool ret=false;
    if(s1[x]=='*')
    {
//        cout<<"here"<<endl;
        int i=0;
        for(int cnt=0;cnt<=4;)
        {
            if(y+i>=strlen(s2)) return false;
            if(dfs(x+1,y+i)==true)
            {
                ret=true;
                return true;
                //break;
            }
            if(s2[y+i]!='*')
            {
                cnt++;
            }
            i++;

        }
    }
    if(s2[y]=='*')
    {
        int i=0;
        for(int cnt=0;cnt<=4;)
        {
//            cout<<x<<" a "<<y<<" "<<i<<endl;
            if(x+i>=strlen(s1)) return false;
            if(dfs(x+i,y+1)==true)
            {
                ret=true;
                return true;
                //break;
            }
            if(s1[x+i]!='*')
            {
//                cout<<x<<" b "<<i<<endl;
                cnt++;
            }
            i++;
        }
    }
    if(s1[x]!='*'&&s2[y]!='*')
    {

        if(s1[x]!=s2[y])
        {
            return false;
        }
        while(s1[x]==s2[y]&&s1[x]!='*'&&s2[y]!='*')
        {
            x++;
            y++;
            if(x==strlen(s1)&&y==strlen(s2))
            {
                return true;
            }
//            cout<<x<<" a "<<y<<endl;
        }
        ret=dfs(x,y);
    }
    return ret;
}
int main()
{
    freopen("B-large-practice.in","r",stdin);
//    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    scanf("%d",&T);
    for(int ca=1;ca<=T;ca++)
    {
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        scanf("%s %s",&s1,&s2);

        printf("Case #%d: %s\n",ca,dfs(0,0)==true?"TRUE":"FALSE");
    }
    return 0;
}
//WA: q* q; q* qabc****d; q*e qabc*de

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
manning.microservices.patterns是指微服务架构模式方面的内容。微服务是一种架构风格,它将一个应用程序拆分为一组小的、独立的服务,每个服务都可以独立部署、扩展和维护。manning.microservices.patterns通过提供一些常见的模式,帮助开发人员构建可靠、可伸缩、可维护的微服务架构。 首先,manning.microservices.patterns介绍了服务拆分的模式。它提供了一些指导原则,帮助开发人员确定应该将哪些功能拆分为独立的服务,以及如何定义服务边界。这样可以确保每个服务都专注于一个明确的业务领域,并且可以独立地开发和部署。 其次,manning.microservices.patterns讨论了服务间通信的模式。微服务架构中,各个服务需要相互通信来实现业务流程。这本书介绍了一些常见的通信模式,例如同步调用、异步消息传递和事件驱动架构。开发人员可以根据实际需求选择适合的通信方式。 此外,manning.microservices.patterns还介绍了服务发现和负载均衡的模式。由于微服务架构中的服务数量庞大,需要有一种方法来发现和跟踪可用的服务实例。这本书提供了一些模式,如服务注册与发现、负载均衡和断路器模式,帮助开发人员实现可靠的服务发现和负载均衡机制。 最后,manning.microservices.patterns还探讨了监控和故障处理的模式。微服务架构中,每个服务都可以独立部署和维护,因此需要一种方法来监控服务的健康状况,并及时处理故障。这本书介绍了一些常见的监控和故障处理模式,例如服务指标监控、日志聚合和异常处理模式。 总之,manning.microservices.patterns是一本关于微服务架构模式的书籍,它提供了一些常见的模式,帮助开发人员构建可靠、可伸缩、可维护的微服务架构。这些模式涵盖了服务拆分、服务间通信、服务发现和负载均衡、监控和故障处理等方面,可以帮助开发人员在构建微服务架构时更加高效地解决各种技术挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值