地里新农-请到考试中心学习规则
- 积分
- 1
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-9-18
- 最后登录
- 1970-1-1
|
第二题可以练一下DFS。C++ implementation。
void help(unordered_map<char, string> &info,
unordered_set<string> &usedStr,
const string &pattern, const string &data,
int levelp, int leveld, bool &flag){
int sizep = pattern.size();
int sized = data.size();
if (levelp == sizep || leveld == sized){
flag = (levelp == sizep && leveld == sized);
return;
}
string temp("");
for (int i=levelp; i<sizep; i++){
if (info.find(pattern[i]) == info.end()){
for (int j=leveld; j<sized; j++){
temp += data[j];
if (usedStr.find(temp) != usedStr.end()) continue;
usedStr.insert(temp);
info[pattern[i]] = temp;
help(info, usedStr, pattern, data, levelp+1, j+1, flag);
if (flag) return;
info.erase(pattern[i]);
usedStr.erase(temp);
}
} else {
for (int j=leveld; j<sized; j++){
temp += data[j];
if (info[pattern[i]] != temp) continue;
help(info, usedStr, pattern, data, levelp+1, j+1, flag);
if (flag) return;
}
}
}
}
bool match(string pattern, string data){
int p = pattern.size();
if (p <= 1) return true;
unordered_map<char, string> info; // store (char, string) relation
unordered_set<string> usedStr; // store used string to avoid that different chars correponds to same string
bool flag = false;
help(info, usedStr, pattern, data, 0, 0, flag);
return flag;
}
int main(){
cout << match("abba", "redbluebluered") << endl;
cout << match("abba", "redblueyellowred") << endl;
cout << match("aaaa", "redredredred") << endl;
cout << match("abba", "redredredred") << endl;
return 0;
}
补充内容 (2014-10-8 09:11):
help function中第一个for loop是多余的,只要分析当前levelp那层就行 |
|