function+lambda(leetcde.676)

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);
 */
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值