Loading

Leetcode-290-单词规律

题目链接


题目描述

给定一种规律 pattern 和一个字符串 str , 判断 str 是否遵循相同的规律。
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true

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

要求

O(n) 时间复杂度

思路

(为什么这题的分类是简单....真的是我太笨了吗😭)

  1. 一开始想到用 一个 hashMap 记录 p 中每个字符对应的 str 。
    当如上示例2 是过不了的。
    因为这样的话 a 对应的是 dog,
    b 对应的也是 dag。

  2. 两个 hashMap
    一个 Map 记录 p 中每个字符对应的 str
    另一个 Map 记录每个 str 对应 p 中的字符

  3. 遍历字符串,判断是否符合规律
    当两个map都没记录时, 进行记录。
    当只有一个有记录,另一个没有时(如示例2b ),返回false
    当都有记录,但当前的 p 和 str 与记录不对应时,返回false


C++代码

class Solution {
public:
    bool wordPattern(string p, string s) {
        vector<string> s1 =split(s, ' ');
        int n1 = p.length();
        int n2 = s1.size();
        if (n1 != n2) return false;
        unordered_map <char, string> mp1;
        unordered_map <string, char> mp2;
        for (int i = 0; i < n1; i++) {
            if (mp1[p[i]] == "" && mp2.count(s1[i])==0) {
                mp1[p[i]] = s1[i];
                mp2[s1[i]] = p[i];
            } else if (mp1[p[i]] == "" || mp2.count(s1[i])==0 || mp1[p[i]] != s1[i])
                return false;
        }
        return true;
    }
    vector<string> split(string s, char c)
    {
        vector<string> ans;
        string ts = "";
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == c && ts.size()!= 0) 
                ans.push_back(ts), ts = "";
            else 
                ts.push_back(s[i]);
        }
        if (ts != "") ans.push_back(ts);
        return ans;
    }
};
posted @ 2022-01-14 20:01  ARUI丶  阅读(27)  评论(0编辑  收藏  举报