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
.
Example 1:
Input: pattern ="abba"
, str ="dog cat cat dog"
Output: true
Example 2:
Input:pattern ="abba"
, str ="dog cat cat fish"
Output: false
Example 3:
Input: pattern ="aaaa"
, str ="dog cat cat dog"
Output: false
Example 4:
Input: pattern ="abba"
, str ="dog dog dog dog"
Output: false
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters separated by a single space.
Approach #1: using map with C++.[Wrong Answer.
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> strArr;
helper(str, strArr);
if (pattern.length() != strArr.size()) return false;
map<char, string> mp;
for (int i = 0; i < pattern.length(); ++i) {
if (mp[pattern[i]] == "") mp[pattern[i]] = strArr[i];
else if (mp[pattern[i]] != strArr[i]) return false;
}
return true;
}
void helper(string str, vector<string>& strArr) {
int len = str.length();
string temp = "";
for (int i = 0; i <= len; ++i) {
temp += str[i];
if (str[i] == ' ' || str[i] == '\0') {
strArr.push_back(temp);
temp = "";
}
}
}
};
Approach #2: Using istringstream with C++.
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char, int> mapChar;
map<string, int> mapString;
istringstream in(str);
int i = 0, n = pattern.size();
for (string word; in >> word; ++i) {
if (i == n || mapChar[pattern[i]] != mapString[word])
return false;
mapChar[pattern[i]] = mapString[word] = i + 1;
}
return i == n;
}
};
Approach #2: Java.
class Solution {
public boolean wordPattern(String pattern, String str) {
String[] words = str.split(" ");
if (words.length != pattern.length()) return false;
Map index = new HashMap();
for (Integer i = 0; i < words.length; ++i) {
if (index.put(pattern.charAt(i), i) != index.put(words[i], i)) return false;
}
return true;
}
}
Approach: #3: Python.
class Solution(object):
def wordPattern(self, pattern, str):
"""
:type pattern: str
:type str: str
:rtype: bool
"""
s = pattern
t = str.split()
return map(s.find, s) == map(t.index, t)
Time Submitted | Status | Runtime | Language |
---|---|---|---|
a few seconds ago | Accepted | 1 ms | java |
4 minutes ago | Accepted | 20 ms | python |
6 minutes ago | Accepted | 0 ms | cpp |