今天有点晚,直接上题了,一毛钱的都不跟你们唠
二 上题!
Q:已知字符串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"不匹配.
三 想想?
冷静分析:
1.当切分出一个单词时,若该单词已出现过,那么这个单词对应的pattern字符,必须也是之前出现时对应的pattern字符
2.当切分出一个单词时,若该单词没有出现过,则与之对应的pattern字符也不能出现过
3.单词的个数必须与pattern中字符的数量相同
那么问题来了,我们怎么将一个单词和一个字符绑定在一起呢?
这里引入新的概念,哈希map
如果用一句话解释,它就是个key-value的数据结构,保存的是key到value的映射
在c++标准STL中也支持了这种数据结构,只需#include<map>即可使用
举个栗子,大家就对哈希map的使用了解了
运行结果
怎么样,是不是对hash map的用法瞬间通透了
在这还要十分建议大家底下自行了解一下hash map原理,十分有用,你懂得
好了,知道怎么用hash map之后,我们可以这样处理逻辑:
1.建立单词到单个字符的哈希映射,使用数组used[128]来标志,当前的单个字符是否已被使用
2.遍历单词字符串str,按照空格切分单词,同时移动pattern下标,判断:
如果该单词从未出现在哈希表中:
如果当前的pattern单个字符已被使用,返回false,不匹配;
如果当前pattern字符没被使用,那么:
建立该单词到单个字符的映射,同时标记单个字符已被使用;
如果该单词出现在了哈希表中:
检查该单词应该匹配的字符,是否与当前pattern字符相同,如果相同,则匹配,如果不相同,则返回false