LeetCode Find and Replace Pattern 查詢和替換模式
You have a list of words
and a pattern
, and you want to know which words in words
matches the pattern.
A word matches the pattern if there exists a permutation of letters p
so that after replacing every letter x
in the pattern with p(x)
, we get the desired word.
(Recall that a permutation of letters is a bijection from letters to letters: every letter maps to another letter, and no two letters map to the same letter.
Return a list of the words in words
that match the given pattern.
You may return the answer in any order.
Example 1:
Input: words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb" Output: ["mee","aqq"] Explanation: "mee" matches the pattern because there is a permutation {a -> m, b -> e, ...}. "ccc" does not match the pattern because {a -> c, b -> c, ...} is not a permutation, since a and b map to the same letter.
Note:
1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 20
你有一個單詞列表 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
題解,給定一個字串陣列和一個匹配的pattern字串,判斷字串陣列中的每一個字串是否符合該pattern的模式。
例如有一個字串陣列為:
["abc","deq","mee","aqq","dkd","ccc"],pattern為:"abb",那麼需要在字串陣列中去一一遍歷尋找,第一個"abc",它的構成模式不符合"abb"的模式,故略去;依次往後走,直到"mee",這個字元滿足"abb"的模式,也就是第二和第三個字元相同,那麼將它壓入到list中;繼續往後走,直到"aqq",壓入list中。
那麼看到這道題,我想到的解題思路是構造一個hashmap,遍歷每一個字串,將該字串中的每一個字元都和pattern中的每一個字元進行一一對應,例如,第一個"abc",則遍歷之後,a對應pattern中的a;第二個"b"遍歷後對應pattern中的第而個"b";但是第三個"c"和pattern中的"b"不對應,所以該字元不能壓入list中。所以hashmap以pattern中的每個字元為key,以字串中的每個字元為value,進行遍歷。但是這裡需要特別注意的地方是凡是pattern中不一樣的字元,所對應的字串中的每一個字元必須不一樣,哪怕對應到字串中的字元沒有在hashmap中出現過,這需要單獨判斷!!!
這個小錯誤很容易忽視,從而引起大的問題。
public static List<String> findAndReplacePattern(String[] words, String pattern)
{
List<String> list = new ArrayList<>();
for(int i = 0; i < words.length; i++)
{
if(words[i].length() != pattern.length())
continue;
Map<Character,Character> hashMap = new HashMap<>();
boolean isTest = true;
for(int j = 0; j < pattern.length(); j++)
{
if(!hashMap.containsKey(pattern.charAt(j)))
{
if(!hashMap.containsValue(words[i].charAt(j))) //這種情況很容易遺漏,當某個字元從來沒有在hashmap的key中出現過時,還要判斷hashmap中的value是否出現將要插入的words[i].charat(j)的字元,如果有,那說明肯定和之前某個字元重複了,但這和pattern重複了
hashMap.put(pattern.charAt(j),words[i].charAt(j));
else
{
isTest = false;
break;
}
}
else
{
if(hashMap.get(pattern.charAt(j)) != words[i].charAt(j))
{
isTest = false;
break;
}
}
}
if(isTest == true)
list.add(words[i]);
}
return list;
}