//------------------------------------------Solution------------------------------------------
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
//check if character a is equal to character b
bool isEqual(char a, char b) {
if (a != '.' && b != '.' && a != b)
return false;
return true;
}
//check if the next character of id-th character is star character or not
bool getIsStar(const string &pattern, int id) {
if (id + 1 < pattern.size())
if (pattern[id + 1] == '*')
return true;
return false;
}
bool solve(const string &text, const string &pattern, bool isStar, int curText, int curPattern) {
if (curText >= text.size() && curPattern >= pattern.size())
return true;
if (curText >= text.size() || curPattern >= pattern.size())
if (curText >= text.size())
if (isStar)
return true; //corner case: "" ~ "a*"
else
return false;
else
return false;
if (isStar) {
bool result;
//skip this star ~ "?*" is equal to ""
result = solve(text, pattern, getIsStar(pattern, curPattern + 2), curText, curPattern + 2);
//try all possible lenght of "?*" such as "?", "??", "???", etc.
//increase length to check while isEqual() returns true
for (int i = 1; curText + i <= text.size(); i++)
if (isEqual(text[curText + i - 1], pattern[curPattern]))
//if exist a way to make the answer true, it will be true
//so use function max() to get the best answer
result = max(result, solve(text, pattern, getIsStar(pattern, curPattern + 2), curText + i, curPattern + 2));
else
break;
return result;
}
//normal case: compare two characters which are not star characters
if (isEqual(text[curText], pattern[curPattern]))
return solve(text, pattern, getIsStar(pattern, curPattern + 1), curText + 1, curPattern + 1);
return false;
}
bool isMatch(const string &text, const string &pattern)
{
return solve(text, pattern, getIsStar(pattern, 0), 0, 0);
}
int main() {
string text, pattern;
cin >> text >> pattern;
cout << (isMatch(text, pattern) ? "True" : "False");
return 0;
}
Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Tb2x1dGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vY2hlY2sgaWYgY2hhcmFjdGVyIGEgaXMgZXF1YWwgdG8gY2hhcmFjdGVyIGIKYm9vbCBpc0VxdWFsKGNoYXIgYSwgY2hhciBiKSB7CglpZiAoYSAhPSAnLicgJiYgYiAhPSAnLicgJiYgYSAhPSBiKQoJCXJldHVybiBmYWxzZTsKCXJldHVybiB0cnVlOwp9CgovL2NoZWNrIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBvZiBpZC10aCBjaGFyYWN0ZXIgaXMgc3RhciBjaGFyYWN0ZXIgb3Igbm90CmJvb2wgZ2V0SXNTdGFyKGNvbnN0IHN0cmluZyAmcGF0dGVybiwgaW50IGlkKSB7CglpZiAoaWQgKyAxIDwgcGF0dGVybi5zaXplKCkpCgkJaWYgKHBhdHRlcm5baWQgKyAxXSA9PSAnKicpCgkJCXJldHVybiB0cnVlOwoJcmV0dXJuIGZhbHNlOwp9Cgpib29sIHNvbHZlKGNvbnN0IHN0cmluZyAmdGV4dCwgY29uc3Qgc3RyaW5nICZwYXR0ZXJuLCBib29sIGlzU3RhciwgaW50IGN1clRleHQsIGludCBjdXJQYXR0ZXJuKSB7CglpZiAoY3VyVGV4dCA+PSB0ZXh0LnNpemUoKSAmJiBjdXJQYXR0ZXJuID49IHBhdHRlcm4uc2l6ZSgpKQoJCXJldHVybiB0cnVlOwoJaWYgKGN1clRleHQgPj0gdGV4dC5zaXplKCkgfHwgY3VyUGF0dGVybiA+PSBwYXR0ZXJuLnNpemUoKSkKCQlpZiAoY3VyVGV4dCA+PSB0ZXh0LnNpemUoKSkKCQkJaWYgKGlzU3RhcikKCQkJCXJldHVybiB0cnVlOwkvL2Nvcm5lciBjYXNlOiAiIiB+ICJhKiIKCQkJZWxzZQoJCQkJcmV0dXJuIGZhbHNlOwoJCWVsc2UKCQkJcmV0dXJuIGZhbHNlOwoJaWYgKGlzU3RhcikgewoJCWJvb2wgcmVzdWx0OwoJCS8vc2tpcCB0aGlzIHN0YXIgfiAiPyoiIGlzIGVxdWFsIHRvICIiCgkJcmVzdWx0ID0gc29sdmUodGV4dCwgcGF0dGVybiwgZ2V0SXNTdGFyKHBhdHRlcm4sIGN1clBhdHRlcm4gKyAyKSwgY3VyVGV4dCwgY3VyUGF0dGVybiArIDIpOwoJCS8vdHJ5IGFsbCBwb3NzaWJsZSBsZW5naHQgb2YgIj8qIiBzdWNoIGFzICI/IiwgIj8/IiwgIj8/PyIsIGV0Yy4KCQkvL2luY3JlYXNlIGxlbmd0aCB0byBjaGVjayB3aGlsZSBpc0VxdWFsKCkgcmV0dXJucyB0cnVlCgkJZm9yIChpbnQgaSA9IDE7IGN1clRleHQgKyBpIDw9IHRleHQuc2l6ZSgpOyBpKyspCgkJCWlmIChpc0VxdWFsKHRleHRbY3VyVGV4dCArIGkgLSAxXSwgcGF0dGVybltjdXJQYXR0ZXJuXSkpCgkJCQkvL2lmIGV4aXN0IGEgd2F5IHRvIG1ha2UgdGhlIGFuc3dlciB0cnVlLCBpdCB3aWxsIGJlIHRydWUKCQkJCS8vc28gdXNlIGZ1bmN0aW9uIG1heCgpIHRvIGdldCB0aGUgYmVzdCBhbnN3ZXIKCQkJCXJlc3VsdCA9IG1heChyZXN1bHQsIHNvbHZlKHRleHQsIHBhdHRlcm4sIGdldElzU3RhcihwYXR0ZXJuLCBjdXJQYXR0ZXJuICsgMiksIGN1clRleHQgKyBpLCBjdXJQYXR0ZXJuICsgMikpOwoJCQllbHNlCgkJCQlicmVhazsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJLy9ub3JtYWwgY2FzZTogY29tcGFyZSB0d28gY2hhcmFjdGVycyB3aGljaCBhcmUgbm90IHN0YXIgY2hhcmFjdGVycwoJaWYgKGlzRXF1YWwodGV4dFtjdXJUZXh0XSwgcGF0dGVybltjdXJQYXR0ZXJuXSkpCgkJcmV0dXJuIHNvbHZlKHRleHQsIHBhdHRlcm4sIGdldElzU3RhcihwYXR0ZXJuLCBjdXJQYXR0ZXJuICsgMSksIGN1clRleHQgKyAxLCBjdXJQYXR0ZXJuICsgMSk7CglyZXR1cm4gZmFsc2U7Cn0KCmJvb2wgaXNNYXRjaChjb25zdCBzdHJpbmcgJnRleHQsIGNvbnN0IHN0cmluZyAmcGF0dGVybikKewoJcmV0dXJuIHNvbHZlKHRleHQsIHBhdHRlcm4sIGdldElzU3RhcihwYXR0ZXJuLCAwKSwgMCwgMCk7Cn0KCmludCBtYWluKCkgewoJc3RyaW5nIHRleHQsIHBhdHRlcm47CgljaW4gPj4gdGV4dCA+PiBwYXR0ZXJuOwoJY291dCA8PCAoaXNNYXRjaCh0ZXh0LCBwYXR0ZXJuKSA/ICJUcnVlIiA6ICJGYWxzZSIpOwoJcmV0dXJuIDA7Cn0=