291. Word Pattern II
- Total Accepted: 7720
- Total Submissions: 21299
- Difficulty: Hard
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
.
Examples:
- pattern =
"abab"
, str ="redblueredblue"
should return true. - pattern =
"aaaa"
, str ="asdasdasdasd"
should return true. - pattern =
"aabb"
, str ="xyzabcxzyabc"
should return false.
Notes:
You may assume both pattern
and str
contains only lowercase letters.
思路其实和I相似,用两个hashmap存储由pattern->str 和str->pattern的映射,递归即可,代码:
public boolean wordPatternMatch(String pattern, String str) { if(pattern.length()==0) return str.length()==0; if(pattern.length()>str.length()) return false; Map<String,String> map1=new HashMap<>(); Map<String,String> map2=new HashMap<>(); return canMatch(pattern,str,map1,map2,0,0); } public boolean canMatch(String pattern,String str,Map<String,String> map1,Map<String,String> map2,int indexp,int indexs){ if(indexp==pattern.length()) return indexs==str.length(); if(map1.get(pattern.substring(indexp,indexp+1))==null){ for(int i=indexs;i<str.length();i++){ if(map2.get(str.substring(indexs,i+1))!=null) continue; map1.put(pattern.substring(indexp,indexp+1),str.substring(indexs,i+1)); map2.put(str.substring(indexs,i+1),pattern.substring(indexp,indexp+1)); if(canMatch(pattern,str,map1,map2,indexp+1,i+1)) return true; map2.remove(str.substring(indexs,i+1)); map1.remove(pattern.substring(indexp,indexp+1)); } return false; } else{ String s=map1.get(pattern.substring(indexp,indexp+1)); if(indexs+s.length()>str.length()||!str.substring(indexs,indexs+s.length()).equals(s)) return false; return canMatch(pattern,str,map1,map2,indexp+1,indexs+s.length()); } }