1. 程式人生 > >HDU 6170 Two strings

HDU 6170 Two strings

題目地址
題意:告訴你兩個字串,第二串有兩種特殊字元(第一種是’.‘可以代表任意字元,第二種是’*‘可以複製任意次前一個字元,或者為空字元,或者刪除前一個字元),求兩個字串能不能匹配。
思路:通過dp的想法,dp[i][j]代表的是第一個字串的到第i個字元,與第二個字串到第j個字元能不能匹配,能匹配就賦那個字元。著重講一下為什麼第一個字串是從0開始但是第二個字串是從1
開始的,因為會有在第一個和第二個的情況,所以這樣的話,按照’‘的規則就可以刪除,所以要把這種情況考慮進去。

#include <iostream>
#include <cstring>
#include <string>
#include <queue> #include <vector> #include <map> #include <set> #include <stack> #include <cmath> #include <cstdio> #include <algorithm> #include <iomanip> #define N 3010 #define LL __int64 #define inf 0x3f3f3f3f #define lson l,mid,ans<<1 #define rson mid+1,r,ans<<1|1
#define getMid (l+r)>>1 #define movel ans<<1 #define mover ans<<1|1 using namespace std; const LL mod = 1000000007; char dp[N][N]; int main() { cin.sync_with_stdio(false); int T; int lena, lenb; string a, b; cin >> T; while (T--) { cin >> a >> b; memset
(dp, -1, sizeof(dp)); lena = a.length(); lenb = b.length(); dp[0][0] = 0; for (int i = 0; i <= lena; i++) { for (int j = 1; j <= lenb; j++) { if (i != 0 && a[i - 1] == b[j - 1] && dp[i - 1][j - 1] != -1) {//相等的時候,當等於-1的時候就說明之前是已經失配的 dp[i][j] = a[i - 1]; } else if (i != 0 && b[j - 1] == '.'&&dp[i - 1][j - 1] != -1) { dp[i][j] = a[i - 1]; } else if (b[j - 1] == '*') { if (dp[i - 1][j - 1] == a[i - 1] || dp[i - 1][j] == a[i - 1]) {//當前位新增一位或者重複 dp[i][j] = a[i - 1]; } if ((dp[i][j - 2] != -1 && j != 1) || dp[i][j - 1] != -1) { dp[i][j] = 0; } } } } if (dp[lena][lenb] == -1) { cout << "no" << endl; } else { cout << "yes" << endl; } } return 0; }