LeetCode 890. 查詢和替換模式(C++、python)
阿新 • • 發佈:2018-12-19
你有一個單詞列表 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
C++
class Solution { public: vector<string> findAndReplacePattern(vector<string>& words, string pattern) { int m=words.size(); int n=pattern.length(); vector<string> res; unordered_map<char,char> temp; set<char> st; int flag=1; for(int i=0;i<n;i++) { st.insert(pattern[i]); } for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(temp.count(words[i][j])<1) { temp[words[i][j]]=pattern[j]; //temp.insert(pair<char,char>(words[i][j],pattern[j])); } else if(temp[words[i][j]]!=pattern[j]) { flag=0; break; } } if(flag && temp.size()==st.size()) { res.push_back(words[i]); } temp.clear(); flag=1; } return res; } };
python
class Solution: def findAndReplacePattern(self, words, pattern): """ :type words: List[str] :type pattern: str :rtype: List[str] """ m=len(words) n=len(pattern) res=[] st=set() for i in range(n): st.add(pattern[i]) for i in range(m): flag=1 dic={} for j in range(n): if words[i][j] not in dic: dic[words[i][j]]=pattern[j] elif dic[words[i][j]]!=pattern[j]: flag=0 break if flag and len(dic)==len(st): res.append(words[i]) return res