Problem Description

题目链接

给定一种规律 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

思路

使用map映射,将每个单词与对应字母的映射关系保存起来,然后判断后面的单词与字母是否跟映射的保持一致,不一致则说明不匹配。

代码

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        if(!pattern.length() || !str.length()){
            return false;
        }
        map<string,char> m;//保存单词与字母的映射关系
        int flag[26] = {0};
        string word = "";
        str += " ";
        int index = 0;
        for(int i = 0; i < str.length(); i++){
            if(str[i] == ' '){
                if(m.find(word) == m.end()){  //字符串中的单词没有出现过,那么就看pattern中对应的字母是否被用过
                    if(flag[pattern[index]-'a']){ //这个字母已经被用过了,则说明不匹配
                        return false;
                    }
                    m[word] = pattern[index];//没有用过,则将单词与字母进行map映射
                    flag[pattern[index]-'a'] = 1;//并将字母进行标记,表示已经用过
                }
                else{  //如果这个单词已经在map中存过了,那么就看pattern中对应的字母是否和map映射的相同
                    if(m[word] != pattern[index]){  //如果不相同的话,则说明不匹配
                        return false;
                    } 
                }
                word = "";
                index++;
            }
            else{
                word+=str[i];
            }
        }
        if(index != pattern.length()){  //如果下标和pattern的长度不对应,则说明pattern的字母数和str的单词数不对应,即不匹配
            return false;
        }
        return true;
    }
};