返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(676.实现神奇字典)
  • 851
分享到

C++实现LeetCode(676.实现神奇字典)

2024-04-02 19:04:59 851人浏览 安东尼
摘要

[LeetCode] 676.Implement Magic Dictionary 实现神奇字典 Implement a magic directory with buil

[LeetCode] 676.Implement Magic Dictionary 实现神奇字典

Implement a magic directory with buildDict, and search methods.

For the method buildDict, you'll be given a list of non-repetitive Words to build a dictionary.

For the method search, you'll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.

Example 1:

Input: buildDict(["hello", "leetcode"]), Output: Null
Input: search("hello"), Output: False
Input: search("hhllo"), Output: True
Input: search("hell"), Output: False
Input: search("leetcoded"), Output: False

Note:

  1. You may assume that all the inputs are consist of lowercase letters a-z.
  2. For contest purpose, the test data is rather small by now. You could think about highly efficient alGorithm after the contest.
  3. Please remember to RESET your class variables declared in class MagicDictionary, as static/class variables are persisted across multiple test cases. Please see here for more details.

这道题让我们设计一种神奇字典的数据结构,里面有一些单词,实现的功能是当我们搜索一个单词,只有存在和这个单词只有一个位置上的字符不相同的才能返回true,否则就返回false,注意完全相同也是返回false,必须要有一个字符不同。博主首先想到了One Edit Distance那道题,只不过这道题的两个单词之间长度必须相等。所以只需检测和要搜索单词长度一样的单词即可,所以我们用的数据结构就是根据单词的长度来分,把长度相同相同的单词放到一起,这样就可以减少搜索量。那么对于和要搜索单词进行比较的单词,由于已经保证了长度相等,我们直接进行逐个字符比较即可,用cnt表示不同字符的个数,初始化为0。如果当前遍历到的字符相等,则continue;如果当前遍历到的字符不相同,并且此时cnt已经为1了,则break,否则cnt就自增1。退出循环后,我们检测是否所有字符都比较完了且cnt为1,是的话则返回true,否则就是跟下一个词比较。如果所有词都比较完了,则返回false,参见代码如下:

解法一:


class MagicDictionary {
public:
    
    MagicDictionary() {}
    
    
    void buildDict(vector<string> dict) {
        for (string word : dict) {
            m[word.size()].push_back(word);
        }
    }
    
    
    bool search(string word) {
        for (string str : m[word.size()]) {
            int cnt = 0, i = 0;
            for (; i < word.size(); ++i) {
                if (word[i] == str[i]) continue;
                if (word[i] != str[i] && cnt == 1) break; 
                ++cnt;
            }
            if (i == word.size() && cnt == 1) return true;
        }
        return false;
    }

private:
    unordered_map<int, vector<string>> m;
};

下面这种解法实际上是用到了前缀树中的search的思路,但是我们又没有整个用到prefix tree,博主感觉那样写法略复杂,其实我们只需要借鉴一下search方法就行了。我们首先将所有的单词都放到一个集合中,然后在search函数中,我们遍历要搜索的单词的每个字符,然后把每个字符都用a-z中的字符替换一下,形成一个新词,当然遇到本身要跳过。然后在集合中看是否存在,存在的话就返回true。记得换完一圈字符后要换回去,不然就不满足只改变一个字符的条件了,参见代码如下:

解法二:


class MagicDictionary {
public:
    
    MagicDictionary() {}
    
    
    void buildDict(vector<string> dict) {
        for (string word : dict) s.insert(word);
    }
    
    
    bool search(string word) {
        for (int i = 0; i < word.size(); ++i) {
            char t = word[i];
            for (char c = 'a'; c <= 'z'; ++c) {
                if (c == t) continue;
                word[i] = c;
                if (s.count(word)) return true;
            }
            word[i] = t;
        }
        return false;
    }
    
private:
    unordered_set<string> s;
};

类似题目:

Implement Trie (Prefix Tree)

参考资料:

https://discuss.leetcode.com/topic/103004/c-clean-code

Https://discuss.leetcode.com/topic/102992/easy-14-lines-java-solution-HashMap

到此这篇关于c++实现LeetCode(676.实现神奇字典)的文章就介绍到这了,更多相关C++实现实现神奇字典内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(676.实现神奇字典)

本文链接: https://lsjlt.com/news/132149.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++实现LeetCode(676.实现神奇字典)
    [LeetCode] 676.Implement Magic Dictionary 实现神奇字典 Implement a magic directory with buil...
    99+
    2024-04-02
  • C++实现LeetCode之神奇字典的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之神奇字典的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 676.Implement Magic Dictionary ...
    99+
    2023-06-20
  • C++实现LeetCode(208.实现字典树(前缀树))
    [LeetCode] 208. Implement Trie (Prefix Tree) 实现字典树(前缀树) Implement a trie with insert,&...
    99+
    2024-04-02
  • C++实现LeetCode(65.验证数字)
    [LeetCode] 65.Valid Number 验证数字 Validate if a given string can be interpreted as a dec...
    99+
    2024-04-02
  • Redis 字典实现
    4.1 字典数据结构 typedef struct dict{  //类型特定函数  dictType *type;  //私有数据  void *privateata;  //哈希表  dictht ht[2];  //r...
    99+
    2014-06-15
    Redis 字典实现
  • C++实现LeetCode(205.同构字符串)
    [LeetCode] 205. Isomorphic Strings 同构字符串 Given two strings s and t, determi...
    99+
    2024-04-02
  • C++实现LeetCode(87.搅乱字符串)
    [LeetCode] 87. Scramble String 搅乱字符串 Given a string s1, we may represent it as a binar...
    99+
    2024-04-02
  • C++实现LeetCode(136.单独的数字)
    [LeetCode] 136.Single Number 单独的数字 Given a non-empty array of integers, every ele...
    99+
    2024-04-02
  • C++实现LeetCode(43.字符串相乘)
    [LeetCode] 43. Multiply Strings 字符串相乘 Given two non-negative integers num1 and...
    99+
    2024-04-02
  • C++实现LeetCode(6.字型转换字符串)
    [LeetCode] 6. ZigZag Conversion 之字型转换字符串 The string "PAYPALISHIRING" is written i...
    99+
    2024-04-02
  • C++怎么实现LeetCode
    这篇文章主要介绍“C++怎么实现LeetCode”,在日常操作中,相信很多人在C++怎么实现LeetCode问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现LeetCode”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • C++如何实现LeetCode
    这篇文章给大家分享的是有关C++如何实现LeetCode的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] Reverse Linked List 倒置链表Reverse a singly lin...
    99+
    2023-06-20
  • C++实现LeetCode(28.实现strStr()函数)
    [LeetCode] 28. Implement strStr() 实现strStr()函数 Implement strStr(). Return the index of...
    99+
    2024-04-02
  • C++实现LeetCode(9.验证回文数字)
    [LeetCode] 9. Palindrome Number 验证回文数字 Determine whether an integer is a palindrome. An int...
    99+
    2024-04-02
  • C++实现LeetCode(647.回文子字符串)
    [LeetCode] 647. Palindromic Substrings 回文子字符串 Given a string, your task is to count how man...
    99+
    2024-04-02
  • C++实现LeetCode(2.两个数字相加)
    [LeetCode] 2. Add Two Numbers 两个数字相加 You are given two non-empty linked lists rep...
    99+
    2024-04-02
  • C++使用LeetCode实现单独的数字
    这篇文章主要介绍C++使用LeetCode实现单独的数字,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 137. Single Number II 单独的数字Given a non-em...
    99+
    2023-06-20
  • C#实现Dictionary字典赋值的方法
    Dictionary<TKey,TValue> 类,表示键和值的集合。 Dictionary<TKey,TValue> 泛型类提供一组键到一组值的映射。 每次...
    99+
    2024-04-02
  • C++实现LeetCode(125.验证回文字符串)
    [LeetCode] 125.Valid Palindrome 验证回文字符串 Given a string, determine if it is a palindrome, co...
    99+
    2024-04-02
  • C++实现LeetCode(8.字符串转为整数)
    [LeetCode] 8. String to Integer (atoi) 字符串转为整数 Implement atoi which converts...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作