<LeetCode OJ> 290. Word Pattern

来源:互联网 发布:英汉翻译软件语音 编辑:程序博客网 时间:2024/06/14 01:04

290. Word Pattern

Total Accepted: 24989 Total Submissions: 89440 Difficulty: Easy

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:

  1. pattern = "abba", str = "dog cat cat dog" should return true.
  2. pattern = "abba", str = "dog cat cat fish" should return false.
  3. pattern = "aaaa", str = "dog cat cat dog" should return false.
  4. 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.


分析:

首先提取str = "dog cat cat dog"为,vecstr={"dog","cat","cat","dog"}
接着利用哈希map(unordered_map)建立对应关系,以下面这个测试案例为例

"abba"

"dog dog dog dog",应该返回false

建立对应正序关系1:通过判断已经被插入mapping1的元素是否矛盾来

mapping1['a']="dog",mapping1['b']="dog",mapping1['b']="dog",mapping1['a']="dog"

能通过测试,因为'a','b'对应的实值的确是"dog"

建立对应反序关系2:通过判断已经被插入mapping2的元素是否矛盾来

mapping2["dog"]='a',mapping2["dog"]='b',mapping2["dog"]='b',mapping2["dog"]='a'

不能通过测试,因为"dog"对应的实值是'a'不能'b',这里显然矛盾了


这位小伙伴尽然做的和我一样:http://blog.csdn.net/booirror/article/details/50084075

class Solution {public:    bool wordPattern(string pattern, string str) {        //提取str = "dog cat cat dog"为,"dog","cat","cat","dog"        vector<string>  vecstr;        int beginpos=0,endpos=0;        while( endpos < str.size() )        {            while(endpos < str.size()&& str[endpos]!=' ')                endpos++;            string sub=str.substr(beginpos,endpos-beginpos);            vecstr.push_back(sub);            beginpos=++endpos;        }        if(vecstr.size()!=pattern.size())            return false;        unordered_map<char,string>   mapping1;        unordered_map<string,char>   mapping2;        for(int i=0;i<pattern.size();i++)        {            if(mapping1.find(pattern[i])==mapping1.end())//正序判断                mapping1[pattern[i]]=vecstr[i];            else{                if(mapping1[pattern[i]]!=vecstr[i])                    return false;            }            if(mapping2.find(vecstr[i])==mapping2.end())//逆序判断                mapping2[vecstr[i]]=pattern[i];            else{                if(mapping2[vecstr[i]]!=pattern[i])                    return false;            }         }        return true;    }};





注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50651635

原作者博客:http://blog.csdn.net/ebowtang

1 0
原创粉丝点击