描述
萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替乙個或多個真正字元。萬用字元有問號(?)和星號(*)等,其中,「?」可以代替乙個字元,而「*」可以代替零個或多個字元。
你的任務是,給出乙個帶有萬用字元的字串和乙個不帶萬用字元的字串,判斷他們是否能夠匹配。
例如,1?456 可以匹配 12456、13456、1a456,但是卻不能夠匹配23456、1aa456;
2*77?8可以匹配 24457798、237708、27798。
輸入輸入有兩行,每行為乙個不超過20個字元的字串,第一行帶萬用字元,第二行不帶萬用字元
輸出如果兩者可以匹配,就輸出「matched」,否則輸出「not matched」
樣例輸入
1*456?
11111114567
樣例輸出
matched
總時間限制:
1000ms
記憶體限制:
65536kb
cs的模擬賽裡有這道題,當時花了40分鐘,用記憶化搜尋ac了此題。當時由於ak(了三道水題)而感到很得意,沒有虛心學習輪廓更清晰的演算法實現。今天中國大學先修課計算概論考試的壓軸題是這道,沒做出來。算是乙個教訓吧。最終以6道題ac結束了今天的考試。恭喜dyx、wzh、wnx同學ak。
可以用dp。注意*
考慮三種情形:匹配0個字元、1個字元、多個字元。設f[i][j]
為第乙個字串的字首i是否能和第二個字串的字首j匹配,則這三種情況分別對應f[i-1][j]
、f[i-1][j-1]
、f[i][j-1]
。再者,邊界的處理要慎重。如果把字首0作為空串,那麼空串能和空串、*
匹配。
#include
#include
using
namespace
std;
char s[22], t[22];
bool f[22][22];
int main()
puts(f[m][n] ? "matched" : "not matched");
return
0;}
附上記憶化搜尋:
#include
#include
using
namespace
std;
char s[21], t[21];
int ans[21][21];
int m, n;
bool search(int i, int j)
if (s[i] != t[j])
return a = false;
return a = search(i+1, j+1);
}int main()
初賽、大學先修課兩連掛,算是澆了一盆讓人清醒的冷水。 帶萬用字元的字串匹配
05 帶萬用字元的字串匹配 描述萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替乙個或多個真正字元。萬用字元有問號 和星號 等,其中,可以代替乙個字元,而 可以代替零個或多個字元。你的任務是,給出乙個帶有萬用字元的字串和乙個不帶萬用字元的字串,判斷他們是否能夠...
帶萬用字元的字串匹配問題的動態規劃演算法
字串匹配問題,給定一串字串,按照指定規則對其進行匹配,並將匹配的結果儲存至output陣列中,多個匹配項用空格間隔,最後乙個不需要空格。要求 1.匹配規則中包含萬用字元?和 其中?表示匹配任意乙個字元,表示匹配任意多個 0 字元。2.匹配規則要求匹配最大的字元子串,例如a d,匹配abbdd而非ab...
OpenJudge 帶萬用字元的字串匹配
萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替乙個或多個真正字元。萬用字元有問號 和星號 等,其中,可以代替乙個字元,而 可以代替零個或多個字元。你的任務是,給出乙個帶有萬用字元的字串和乙個不帶萬用字元的字串,判斷他們是否能夠匹配。例如,1?456 可以匹配...