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 substring in str
.(i.e if a
corresponds to s
, then b
cannot correspond to s
. For example, given pattern = "ab"
, str = "ss"
, return false
.)
Example
Example 1
Input:
pattern = "abab"
str = "redblueredblue"
Output: true
Explanation: "a"->"red","b"->"blue"
Example 2
Input:
pattern = "aaaa"
str = "asdasdasdasd"
Output: true
Explanation: "a"->"asd"
Example 3
Input:
pattern = "aabb"
str = "xyzabcxzyabc"
Output: false
Notice
You may assume both pattern
and str
contains only lowercase letters.
思路:用hashmap记录之前匹配的c to string, 然后遇见c了,看有没有匹配过,如果匹配过,那么str是不是以prefix开头;如果没有就进行搜索匹配,尝试所有的可能,另外如果之前匹配过的str不能再用了,跳过;
class Solution {
public boolean wordPatternMatch(String pattern, String str) {
if(pattern == null && str == null) {
return true;
}
if(pattern == null || str == null) {
return false;
}
HashMap<Character, String> hashmap = new HashMap<>();
return dfs(pattern, str, hashmap);
}
private boolean dfs(String pattern, String str, HashMap<Character, String> hashmap) {
if(pattern.isEmpty()) {
return str.isEmpty();
}
char c = pattern.charAt(0);
if(hashmap.containsKey(c)) {
String match = hashmap.get(c);
if(!str.startsWith(match)) {
return false;
} else {
return dfs(pattern.substring(1), str.substring(match.length()), hashmap);
}
} else {
// hashmap do not contains c;
for(int i = 0; i < str.length(); i++) {
String match = str.substring(0, i + 1);
// 这个很重要,如果当前string,前面已经用过了,就不能再用了;
if(hashmap.values().contains(match)) {
continue;
}
hashmap.put(c, match);
if(dfs(pattern.substring(1), str.substring(match.length()), hashmap)) {
return true;
}
hashmap.remove(c);
}
return false;
}
}
}