leetcode 890. 查詢和替換模式
阿新 • • 發佈:2018-12-02
你有一個單詞列表 words
和一個模式 pattern
,你想知道 words
中的哪些單詞與模式匹配。
如果存在字母的排列 p
,使得將模式中的每個字母 x
替換為 p(x)
之後,我們就得到了所需的單詞,那麼單詞與模式是匹配的。
(回想一下,字母的排列是從字母到字母的雙射:每個字母對映到另一個字母,沒有兩個字母對映到同一個字母。)
返回 words
中與給定模式匹配的單詞列表。
你可以按任何順序返回答案。
示例:
輸入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb" 輸出:["mee","aqq"] 解釋: "mee" 與模式匹配,因為存在排列 {a -> m, b -> e, ...}。 "ccc" 與模式不匹配,因為 {a -> c, b -> c, ...} 不是排列。 因為 a 和 b 對映到同一個字母。
提示:
1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 20
根據題意就是要在words裡找到和pattern模式相同的字串。
遍歷words,取出每個word,將其與pattern比對,如果模式相同則加入結果集中。
要判斷一個word和pattern模式是否相同,可以設兩個map來實現,建立word[i]和pattern[i]之間的雙對映。當word[i]和pattern[i]之間還沒有建立對映,則為其建立對映:map1[word[i]]=pattern[i],map2[pattern[i]]=word[i]。若發現word[i]或pattern[i]已有對映卻不是指向的對方,即map1[word[i]]!=pattern[i]或map2[pattern[i]]!=word[i],則說明模式不相同。
需要注意的是遍歷words時記得把兩個map清空,並設立flag來標記word與pattern模式是否相同。遍歷一遍後返回結果集即可。
class Solution {
public List<String> findAndReplacePattern(String[] words, String pattern) {
List<String> res = new ArrayList<>();
Map<Character,Character> m1 = new HashMap<>();
Map<Character,Character> m2 = new HashMap<>();
boolean flag=true;
for(String s:words){
m1.clear();
m2.clear();
flag=true;
for(int i=0;i<s.length();i++){
char c1 = s.charAt(i);
char c2 = pattern.charAt(i);
if(!m1.containsKey(c1)&&!m2.containsKey(c2)){
m1.put(c1,c2);
m2.put(c2,c1);
}
else if(m1.containsKey(c1)&&m1.get(c1)!=c2||m2.containsKey(c2)&&m2.get(c2)!=c1){
flag=false;
break;
}
}
if(flag){
res.add(s);
}
}
return res;
}
}