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;
}
};