美文网首页LeetCode
词语模式_哈希表

词语模式_哈希表

作者: 徐凯_xp | 来源:发表于2018-05-10 10:46 被阅读1次

已知字符串pattern与字符串str,确认str是否与pattern匹配。str与pattern匹配代表字符 串str中的单词与pattern中的字符一一对应。(其中pattern中只包含小写字符,str中的单词只包含小写字符,使用空格分隔。)
例如,
pattern = “abba”, str = “dog cat cat dog” 匹配.
pattern = “abba”, str = “dog cat cat fish” 不匹配.
pattern = "aaaa", str = "dog cat cat dog"不匹配.
pattern = "abba", str = "dog dog dog dog"不匹配.
LeetCode 290. Word Pattern

思考与分析

匹配:字符串str中的单词与pattern中的字符一一对应。
如:
1)假设pattern = “abba”, str = “dog cat cat ” ;则一定代表dog。
2)假设pattern = “abb?”, str = “dog cat cat dog” ;则?一定代表a。
3)假设pattern = “abb?”, str = “dog cat cat fish” ;则?一定不是a或b。
4)假设pattern = “abba”,str = “”;代表了4个单词,且第1、4单词相同;2、3单词相同,并且 1、2两个单词不同。
5)假设pattern = “”,str = “dog cat cat dog”;代表了4个字符,且1、4字符相同;2、3字符相 同,并且1、2两个字符不同。

分析结论:
以单词为单位进行拆解与判断:
1.当拆解出一个单词时,若该单词已出现,则当前单词对应的pattern字符必为该单词曾经对
应的pattern字符。
2.当拆解出一个单词时,若该单词未曾出现,则当前单词对应的pattern字符也必须未曾出现 。
3.单词的个数与pattern字符串中的字符数量相同。

算法设计

pattern = “abb?”, str = “dog cat cat *”;
dog -> a;cat->b
1.设置单词(字符串)到pattern字符的映射(哈希);使用数组used[128]记录pattern字符是否使用。
2.遍历str,按照空格拆分单词,同时对应的向前移动指向pattern字符的指针,每拆分出一个 单词,判断:
如果该单词从未出现在哈希表中:
如果当前的pattern字符已被使用,则返回false;
将单词与当前指向的pattern字符做映射; 标记当前指向的pattern字符已使用。
否则
如果当前单词在哈希表中的映射字符不是当前指向的 pattern字符,则返回false。
3.若单词个数与pattern字符个数不匹配,返回false。


class Solution{
public:
    bool wordPattern(std::string pattern, std::string str){
    std::map(std::string,char) word_map;//单词到pattern字符的映射
    char used[128] = {0};//已被映射的pattern字符
    std::string word;//临时保存拆分出来的单词
    int pos = 0; //当前指向的pattern字符
    str.push_back(' ');//str尾部push一个空格,使得遇到空格拆分单词
    for(int i =0; i < str.length(); i++){
        if(str[i] == '  '){//遇到空格,即拆分一个新单词
            if(pos == pattern.length()){
                return false;
            }
//若单词未出现在哈希映射中
            if(word_map.find(word) == word_map.end()){
                if(used[pattern[pos]]){//如果当前pattern字符已使用
                    return false; 
                }
                word_map[word] = pattern[pos];
                used[pattern[pos]] = 1;   
            }
            else{
                if(word_map[word] != pattern[pos]){//若当前word已建立映射无法与当前pattern对应
                    return false;
                }
            }
            word = " ";//完成一个单词的插入和查询后,清空word
            pos++;  
        }
        else{
            word += str[i];
        }
    }
    if(pos != pattern.length()){
        return false;
    }
    return true;
    }
}

相关文章

  • 词语模式_哈希表

    已知字符串pattern与字符串str,确认str是否与pattern匹配。str与pattern匹配代表字符 串...

  • Java数据结构_哈希表_基本概念

    本文目标 哈希表的基本概念,哈希冲突,哈希函数 什么是哈希表 哈希表也叫做散列表(hash有剁碎的意思)哈希表是空...

  • Mysql知识梳理 -- 索引

    索引 常见的索引模式 常见的索引模型有哪些?列举三种常见的。常见的索引模型包括:哈希表,有序数组,搜索树 哈希表模...

  • redis数据结构--字典

    Redis的字典底层就是哈希表。 哈希表 首先给出哈希表的定义: 其中可以看到,table是一个哈希表节点的数组,...

  • 哈希表和链表

    优秀文章:Chapter: 散列表(哈希表) 一、哈希表 哈希表hashtable(key,value) 就是把K...

  • 算法-哈希表算法总结

    1 哈希表模拟 思路:通过设计哈希表,模拟O(1)时间复杂度的哈希表。 2 数组作为哈希表 思路:数组就是简单的哈...

  • 数据结构 -- 哈希表及其应用

    这篇主要用来记录一下学习到的关于哈希表的知识点。 文章结构 哈希表 哈希表的定义 哈希表的优缺点 哈希碰撞 负载因...

  • 数据结构与算法(第一季):哈希表(Hash Table)

    一、哈希表(Hash Table) 1、概念 哈希表也叫做散列表。 哈希表的原理: 利用哈希函数生成key对应的i...

  • 深入理解哈希表

    深入理解哈希表 深入理解哈希表

  • 2019 算法面试相关(leetcode)--哈希表

    哈希表相关的原理可以参考下:浅谈哈希表(HashTable)深入理解哈希表哈希表的理解理解HashSet及使用 哈...

网友评论

    本文标题:词语模式_哈希表

    本文链接:https://www.haomeiwen.com/subject/oehorftx.html