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.
C++:
// Runtime: 0 ms
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector words;
istringstream iss(str);
string temp;
while (iss>>temp)
{
words.push_back(temp);
}
if (words.size() != pattern.size())
{
return false;
}
unordered_map mymap;
set used;
for (int i = 0; i < pattern.length(); i++)
{
if (mymap.find(pattern[i]) == mymap.end())
{
if (used.find(words[i]) == used.end())
{
mymap[pattern[i]] = words[i];
used.insert(words[i]);
}
else
{
return false;
}
}
else if (mymap[pattern[i]].compare(words[i]) != 0)
{
return false;
}
}
return true;
}
};
Java:
// Runtime: 3 ms
public class Solution {
public boolean wordPattern(String pattern, String str) {
String words[] = str.split( );
if (pattern.length() != words.length) {
return false;
}
Map mymap = new HashMap();
for (int i = 0; i < pattern.length(); i++) {
if (!mymap.containsKey(pattern.charAt(i))) {
if (!mymap.containsValue(words[i])) {
mymap.put(pattern.charAt(i), words[i]);
}
else {
return false;
}
}
else if (!mymap.get(pattern.charAt(i)).equals(words[i])) {
return false;
}
}
return true;
}
}