function+lambda(leetcde.676)
想法:
本题其实直接使用一个容器存储输入的数组中的字符串(甚至直接赋值也可以)然后逐一和输入的字符串比对,保证修改字符不超过1(diff <= 1)的情况下就可以得出0/1。但是其实看到了字符串问题其实也想到了字典树,思路其实就是在存储每个字符串元素的时候,就开始构建字典树的每一层(树末尾带有is_finished = true标志, 表示已经是最后一个元素了)(在判断的时候也是用到这个is_finished,同时使用一个标志位来记录是否有不相同的字母出现,有就将标志位置为true,第二次有不相同的字母就跳过使用!modified
这种判定跳过),其余基本都是在递归判断每个节点的结果。官方题解中使用了一种function+lambda的方式写这个函数,感觉挺有意思的。
std::function() 语法:return_type是函数返回值类型,parameter_types是函数参数类型。
std::function<return_type(parameter_types)> var_name;
function<bool(DictTree*, int, bool)> dfs = \ //std::function
[&](DictTree* node, int pos, bool modified) {...} //lambda
code(+了.注释):
struct DictTree
{
bool is_finished;
DictTree* child[26];
DictTree()
{
is_finished = false;
fill(begin(child), end(child), nullptr); //在b和e中间填写val值
}
};
class MagicDictionary
{
private:
DictTree* root;
public:
MagicDictionary()
{
root = new DictTree();
}
void buildDict(vector<string> dictionary)
{
for(auto&& word : dictionary)
{
DictTree* cur = root; //前驱节点
for(char ch : word)
{
int index = ch - 'a'; //获取ascii码
if(!cur->child[index])
{
cur->child[index] = new DictTree();
}
cur = cur->child[index];
}
cur->is_finished = true; //表示一个单词的最后一个字母
}
}
bool search(string searchWord)
{
function<bool(DictTree*, int, bool)> dfs = \
[&](DictTree* node, int pos, bool modified)
{
if(pos == searchWord.size())
{
return modified && node->is_finished;
//成功走到最后一个字母并且只有一个字母不相同
//(如果出现了字母第二次相同会直接返回false)
}
int index = searchWord[pos] - 'a'; //search字母ascii下标
if(node->child[index])
//如果下一个字母存在,就判断下一个字母否则进入是否已经有一个字符不相同的判断
{
if(dfs(node->child[index], pos + 1, modified))
//如果判断为false不会执行,贯穿到最后返回false
{
return true;
}
}
if(!modified)
//如果已经替换过字符,该处就是!TRUE,不会执行循环,走到最后返回false
{
for(int i = 0; i < 26; ++i)
{
if(i != index && node->child[i]) //找到不同的字母
{
if(dfs(node->child[i], pos + 1, true))
//进入递归如果没有第二个不相同的字母不会返回false
{
return true;
}
}
}
}
return false;
};
return dfs(root, 0, false);
}
};
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary* obj = new MagicDictionary();
* obj->buildDict(dictionary);
* bool param_2 = obj->search(searchWord);
*/