帶萬用字元的字串匹配 動態規劃

2021-07-23 23:27:08 字數 1484 閱讀 3320

描述

萬用字元是一類鍵盤字元,當我們不知道真正字元或者不想鍵入完整名字時,常常使用萬用字元代替乙個或多個真正字元。萬用字元有問號(?)和星號(*)等,其中,「?」可以代替乙個字元,而「*」可以代替零個或多個字元。

你的任務是,給出乙個帶有萬用字元的字串和乙個不帶萬用字元的字串,判斷他們是否能夠匹配。

例如,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 可以匹配...