LeetCode算法题290:单词模式解析

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。

这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。
示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

这个题有些复杂,字符串操作的题总是有些复杂的,但是思路还是不难,就是用哈希表存储键值对,然后判断是不是有不同映射,如果有就是false。当哈希表中没有出现pattern字母时,还需要判断之前的值是否和当前str中的字符串有重叠,如果有就是false,如果没有重叠,那么就可以把当前的模式和字符串加入哈希表的键值中。当出现这个键时,如果其值与当前字符串不同,那么就是false。这里其实还有一个很重要的问题就是当pattern中的元素个数和str中的元素个数不同时一定要返回false,否则会导致一些边界溢出问题,这个问题在C++中不明显但是还是会有隐患,在python中会有测试样例出错。
C++源代码:

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        int n = 0;
        for(int i=0;i<str.length();i++)
        {
            if (str[i]==' ') n++;
        }
        if (pattern.length()!=n+1)
            return false;
        map<char, string> m;
        istringstream in(str);
        int i=0;
        for (string word;in>>word;i++)
        {
            if (m.count(pattern[i])==0)
            {
                for(map<char,string>::iterator it=m.begin();it!=m.end();it++)
                {
                    if (it->second==word) return false;
                }
                m[pattern[i]] = word;   
            }
            else if (m[pattern[i]]!=word)
                return false;
        }
        return i==pattern.length();
    }
};

python3源代码:

class Solution:
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        if len(pattern)!=len(str.split()):
            return False
        m = {}
        i = 0
        for word in str.split():
            if pattern[i] not in m:
                for key, value in m.items():
                    if value == word:
                        return False
                m[pattern[i]] = word
            elif m[pattern[i]]!=word:
                return False
            i += 1
        return i==len(pattern)

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/84234746
今日推荐