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.
public class Solution {
public boolean wordPattern(String pattern, String str) {
String[] strArray = str.split(" ");
if(pattern.length() != strArray.length)
return false;
Map<Character, String> map = new HashMap<>();
Map<String, Character> reverseMap = new HashMap<>();
for(int i = 0; i < strArray.length; i++){
Character currentChar = pattern.charAt(i);
String currentString = strArray[i];
if(!map.containsKey(currentChar)){
if(reverseMap.containsKey(currentString))
return false;
else{
map.put(currentChar, currentString);
reverseMap.put(currentString, currentChar);
}
}
else{
if( !map.get(currentChar).equals(currentString))
return false;
}
}
return true;
}
}
reverseMap 可以用set来代替。
public class Solution {
public boolean wordPattern(String pattern, String str) {
String[] strArray = str.split(" ");
if(pattern.length() != strArray.length)
return false;
Map<Character, String> map = new HashMap<>();
Set<String> reverseRecord = new HashSet<>();
for(int i = 0; i < strArray.length; i++){
Character currentChar = pattern.charAt(i);
String currentString = strArray[i];
if(!map.containsKey(currentChar)){
//when we reach this step, we know that currentChar has never appeared before, so we expect that currentString
//has not appeated either. If it has appeared, then it must not map to currentChar
if(reverseRecord.contains(currentString))
return false;
else{
map.put(currentChar, currentString);
reverseRecord.add(currentString);
}
}
else{
if( !map.get(currentChar).equals(currentString))
return false;
}
}
return true;
}
}