HDU 6170 Two strings
阿新 • • 發佈:2018-12-24
題目地址
題意:告訴你兩個字串,第二串有兩種特殊字元(第一種是’.‘可以代表任意字元,第二種是’*‘可以複製任意次前一個字元,或者為空字元,或者刪除前一個字元),求兩個字串能不能匹配。
思路:通過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;
}