【leetcode】290. Word Pattern(Python & C++)

51 篇文章 1 订阅
50 篇文章 28 订阅

290. Word Pattern

题目链接

290.1 题目描述:

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.

290.2 解题思路:

  1. 思路一:首先将str遍历,按照空格分开,放进vector中。判断vector的大小是否与pattern的长度一样,如果不一样,返回false。建立两个映射map,一个是char到string的,pattern映射到str;一个是string到char的,str映射到pattern。遍历pattern个长度,首先判断映射1,如果当前坐标下,映射1的值为空,则将vector同坐标下的string赋给映射1。否则判断映射1的值与vector同坐标下的string是否相同,如果不相同,则返回false。然后判断映射2,如果当前坐标下,映射2的值为空,则将pattern同坐标下的char赋给映射2。否则判断映射2的值与pattern同坐标下的char是否相同,如果不相同,则返回false。遍历结束后,返回true。

  2. 思路二:思想也是用到了映射,不过更为方便。首先,利用istringstream将str输入。这个的好处是直接按照空格处理字符串的输入。然后建立两个映射,一个是char到int的,一个是string到int的。意思是,如果同一坐标下,pattern中字符对应的坐标,与,str中字符串对应的坐标,如果相同,这说明匹配,如果不同,则不匹配。所以在循环中,如果发现两个映射的值不同,则返回false。然后将当前坐标下,两个映射的值置为i+1,之所以是i+1,不是i,是因为刚开始i是从0开始遍历的,而两个映射没进行赋值之前,其任何坐标下的值也是0,容易发生混淆。初次之外,为了防止pattern的长度与str中string的个数不同,在遍历时,如果发现i==pattern的长度(pattern短,str长),也返回false。当遍历结束,返回i==pattern的长度(如果长度不相同,说明pattern长,str短)

  3. 思路三:针对Python。思想差不多与思路二相同,但Python中字符串有自带函数处理分片问题,就s.split(str)就是将s中按照str分片,并且返回分片后一个列表。所以可以直接使用。并且可以利用map(function,sequence),map(s.index,s)返回s中每个string的坐标,map(pattern.find,pattern)返回pattern中每个char的坐标,如果两者相同,则放回true,否则false。

290.3 C++代码:

1、思路一代码(0ms):

class Solution109 {
public:
    bool wordPattern(string pattern, string str) {
        map<char, string>m1;
        map<string, char>m2;
        vector<string>s;
        int f = 0;
        for (int i = 0; i < str.length();i++)
        {
            if (str[i] == ' ')
            {
                s.push_back(str.substr(f, i - f));
                f = i + 1;
            }
        }
        s.push_back(str.substr(f, str.length() - f));
        if (s.size() != pattern.length())
            return false;
        for (int i = 0; i < pattern.length();i++)
        {
            if (m1[pattern[i]] == "")
                m1[pattern[i]] = s[i];
            else
                if (m1[pattern[i]] != s[i])
                    return false;
            if (m2[s[i]] == NULL)
                m2[s[i]] = pattern[i];
            else
                if (m2[s[i]] != pattern[i])
                    return false;
        }
        return true;
    }
};

2、思路二代码(0ms):

class Solution109_1 {
public:
    bool wordPattern(string pattern, string str) {
        istringstream sw(str);
        map<char, int>p2i;
        map<string, int>s2i;
        string word;
        int i = 0;
        while (sw >> word)
        {
            if (i==pattern.length() || p2i[pattern[i]] != s2i[word])
                return false;
            p2i[pattern[i]] = i + 1;
            s2i[word] = i + 1;
            i++;
        }
        return i == pattern.length();
    }
};

290.4 Python代码:

2、思路三代码(32ms)

class Solution(object):
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        s=str.split(' ')
        return map(s.index,s) == map(pattern.find,pattern)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值