关闭

Word Pattern

224人阅读 评论(0) 收藏 举报
分类:

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.

Examples:
pattern = “abba”, str = “dog cat cat dog” should return true.
pattern = “abba”, str = “dog cat cat fish” should return false.
pattern = “aaaa”, str = “dog cat cat dog” should return false.
pattern = “abba”, str = “dog dog dog dog” should return false.
Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

解题思路:
首先想到就是用哈希表来做,建立模式字符串中每个字符和单词字符串每个单词之间的映射,而且这种映射必须是一对一关系的,不能’a‘和’b’同时对应‘dog’,所以我们在碰到一个新字符时,首先检查其是否在哈希表中出现,若出现,其映射的单词若不是此时对应的单词,则返回false。如果没有在哈希表中出现,我们还要遍历一遍哈希表,看新遇到的单词是否已经是哈希表中的映射,如果没有,再跟新遇到的字符建立映射。
注意:这里使用到istringstream来提取字符串“dog cat cat dog”中的单词,包含在头文件中。使用例子如下:

 string str = "qq cc ddd";
 istringstream stream(str);
 int a;
 while (stream >> a){
        cout << a << endl;
 }

The output will be
qq
cc
ddd
And then the loop will terminate automatically.

代码如下:

bool wordPattern(string pattern, string str) {
map<char, string> mp;
istringstream istr(str);
string tmp;
int i = 0;
while (istr >> tmp){
    if (i == pattern.size()){
        return false;
    }
    if (mp.find(pattern[i]) == mp.end()){
        for (auto j : mp){
            if (j.second == tmp){
                return false;
            }
        }
        mp[pattern[i]] = tmp;
    }
    else if (mp[pattern[i]] != tmp){
        return false;
    }
    i++;
}
if (i < pattern.size()) return false;
return true;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5462次
    • 积分:205
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类