HDU 6170----Two strings(DP)

来源:http://www.cnblogs.com/chen9510/archive/2017/08/24/7421662.html
-Advertisement-
Play Games

題目鏈接 Problem Description Giving two strings and you should judge if they are matched.The first string contains lowercase letters and uppercase letters ...


題目鏈接

 

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     題意:給了兩個字元串,判斷是否匹配。第一個串只包含小寫和大寫字元,第二個串包含小寫、大寫字元,還包括‘ . ’和' * ',' . ' 可以匹配任意一個字元,' * ' 表示' * '之前的字元可以重覆多次,比如a*可以匹配a、aa、aa……以及空串(註:第二個串不會以' * '開始,也不會有兩個連續的' * ')。   思路:考慮DP,每次根據1~i的b串能使a串到達哪些位置,進而推出1~i+1的b串能使a串到達哪些位置。   代碼如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2505;
char a[N],b[N];
int len1,len2;
int dp[N][N];

int main()
{
    int T; cin>>T;
    while(T--){
       scanf("%s%s",a+1,b+1);
       len1=strlen(a+1);
       len2=strlen(b+1);
       memset(dp,0,sizeof(dp));
       dp[0][0]=1;
       for(int i=1;i<=len2;i++)
       {
           if(b[i]=='.')
           {
              for(int j=0;j<=len1;j++)
              {
                  if(dp[i-1][j]) dp[i][j+1]=1;
              }
           }
           else if(b[i]=='*')
           {
              for(int j=0;j<=len1;j++)
              {
                  if(dp[i-1][j])
                  {
                     dp[i][j]=1;
                     dp[i][j-1]=1;
                     while(a[j+1]==a[j]) dp[i][j+1]=1,j++;
                  }
              }
           }
           else
           {
              for(int j=0;j<=len1;j++)
              {
                  if(!dp[i-1][j]) continue;
                  if(a[j+1]==b[i]) dp[i][j+1]=1;
                  else if(b[i+1]=='*') dp[i+1][j]=1;
              }
           }
       }
       if(dp[len2][len1]) puts("yes");
       else puts("no");
    }
    return 0;
}
/*
.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
*/

比賽中我用的深搜模擬的,會超時,但是如果答案是"yes"的話,會很快的計算出,不會超時;如果是” no "的話,會搜索所有的情況,會超時,這個時候我們可以用一個變數記錄一下遞歸次數,當大於一定次數時預設為“no”的情況,退出搜索。(當然這種做法不是正解,腦洞大開,如果有厲害的數據肯定過不了~)

代碼如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2505;
char a[N],b[N];
int len1,len2;
int h[N];
int c;
int dfs(int i,int j)
{
    c++;
    if(c>1000000) return 0;///預設為"no"的情況;
    if(i<len1 && j>=len2) return 0;
    if(i>=len1){
        if(j>=len2) return 1;
        if(j==len2-1 && b[j]=='*') return 1;
        if(j==len2-1 && b[j]!='*') return 0;
        if(j<len2-1){
            if(b[j]=='*' && h[j+1]) return 1;
            else if(b[j]!='*' && h[j]) return 1;
            else return 0;
        }
    }
    if(b[j]=='.') { b[j]=a[i]; int f=dfs(i+1,j+1); b[j]='.'; return f; }
    if(b[j]=='*') {
        if(a[i]==b[j-1]){
            if(dfs(i+1,j)) return 1;
            if(dfs(i,j+1)) return 1;
            if(dfs(i-1,j+1)) return 1;
         }
        else {
            if(dfs(i-1,j+1)) return 1;
            if(dfs(i,j+1)) return 1;
        }
    }
    if(a[i]==b[j]) return dfs(i+1,j+1);
    else if(b[j+1]=='*') return dfs(i,j+2);
    else return 0;
}

int main()
{
    int T; cin>>T;
    while(T--){
       scanf("%s%s",a,b);
       c=0;
       len1=strlen(a);
       len2=strlen(b);
       int flag=1;
       for(int i=len2-1;i>=0;i--)
       {
           if(!flag) h[i]=0;
           else if(b[i]=='*'){
              h[i]=1; h[i-1]=1; i--;
           }
           else{
              h[i]=0;
              flag=0;
           }
       }
       int ans=dfs(0,0);
       if(ans) puts("yes");
       else puts("no");
    }
    return 0;
}
/*
.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
*/

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 狀態機 有限狀態機(Finite State Machine 或 Finite State Automata)是軟體領域中一種重要的工具。 狀態機允許一個對象在其內部狀態改變時改變它的行為。對象內部狀態決定行為方式,對象狀態改變行為方式改變,這裡強調內部狀態。 Command 模式是將命令請求封裝成 ...
  • 一:原題 二:原題講解 ...
  • / :為定界符,要匹配的字元一般放在定界符裡面; 2、 常用元字元 1)+:出現一次或多次 2)*:出現零次或多次 3)?:出現零次或一次 3、限定符 1) 字元1字元2{n} 表示字元2連續出現n次的匹配結果 字元1字元2{n,} 表示字元2連續出現n次或更多次的匹配結果 (字元1字元2){n} ...
  • 題目描述 所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看一個簡單的例子: 43#9865#045 +8468#6633 44445509678 其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。 ...
  • 一、打包JavaWeb應用 在Java中,使用"jar"命令來對將JavaWeb應用打包成一個War包,jar命令的用法如下: 範例:將he這個JavaWeb應用打包成war包 執行完之後,就可以得到一個文件,平時開發完JavaWeb應用後,一般都會將JavaWeb應用打包成一個war包,然後將這個 ...
  • InterlliJ IDEA 、JUnit、插件載入、單元測試 ...
  • 1.根據已完成的Hibernate1基礎案例,我們接下來寫一下查詢,修改刪除,對於基礎生可以學習一下 只改寫一下測試類的代碼 1 private void findStudent() { 2 //02Hibernate 保存 3 //讀取大配置文件,獲取連接的資料庫信息 4 Configuratio ...
  • 我學習go的五個感悟(譯) 原文 "5 things about programming I learned with Go By MICHAŁ KONARSKI" Go在最近一段時間內開始變得十分流行。語言相關的論文和博客每天都在更新,新的golang相關的項目在github中也層出不窮。Go語言 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...