1. 程式人生 > >LeetCode Find and Replace Pattern 查詢和替換模式

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;
    }