leetcode-查找和替換模式

1、題目描述

你有一個單詞列表 words 和一個模式  pattern,你想知道 words 中的哪些單詞與模式匹配。若是存在字母的排列 p ,使得將模式中的每一個字母 x 替換爲 p(x) 以後,咱們就獲得了所需的單詞,那麼單詞與模式是匹配的。(回想一下,字母的排列是從字母到字母的雙射:每一個字母映射到另外一個字母,沒有兩個字母映射到同一個字母。)返回 words 中與給定模式匹配的單詞列表。你能夠按任何順序返回答案。java

2、輸入輸出描述

  一、示例:spa

輸入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb" 輸出:["mee","aqq"] 解釋: "mee" 與模式匹配,由於存在排列 {a -> m, b -> e, ...}。 "ccc" 與模式不匹配,由於 {a -> c, b -> c, ...} 不是排列。 由於 a 和 b 映射到同一個字母。 

  二、提示:code

1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 20

3、思路

4、代碼

  根據上面的思路,使用map實現blog

 1 package cn.zifuchuan;  2 
 3 import java.util.ArrayList;  4 import java.util.HashMap;  5 import java.util.List;  6 import java.util.Map;  7 
 8 public class Test1 {  9 
10     /*
11  * words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abc" 12      */
13     public static void main(String[] args) { 14          String[] words = {"abcc","deqq","meee","aqq","dkd","ccc"}; 15          String pattern = "abcc"; 16  System.out.println(findAndReplacePattern(words, pattern)); 17          
18  } 19     
20     /**
21  * @param words 輸入的字符串 22  * @param pattern 找到符合這個形式的字符串 23  * @return
24      */
25     public static List<String> findAndReplacePattern(String[] words, String pattern) { 26         List<String> res = new ArrayList<>(); 27         Map<Character, Character> map = new HashMap<>(); 28         for (String word : words) { 29             //先簡單的判斷長度
30             if (word.length() != pattern.length()) 31                 continue; 32             boolean flag = true; //判斷當前是否是和pattern形式同樣的字符串
33             for (int i = 0; i < word.length(); i++) { 34                 /*
35  * containsKey 36  * boolean containsKey(Object key)若是此映射包含指定鍵的映射關係,則返回 true。 37  * 更確切地講,當且僅當此映射包含針對知足 (key==null ? k==null : key.equals(k)) 的鍵 k 的映射關係時, 38  * 返回 true。(最多隻能有一個這樣的映射關係)。 39                  */
40                 /*
41  * containsValue 42  * boolean containsValue(Object value)若是此映射將一個或多個鍵映射到指定值,則返回 true。 43  * 更確切地講,當且僅當此映射至少包含一個對知足 (value==null ? v==null : value.equals(v)) 的值 v 的映射關係時, 44  * 返回 true。對於大多數 Map 接口的實現而言,此操做須要的時間可能與映射大小呈線性關係。 45                  */
46                 /*
47  * 一、首先須要將pattern字符串的各個字符做爲key值添加到map中 48  * 判斷是否存在這個key值,若是存在這個key值那麼判斷對應的value值是否是相等 49                  */
50                 if (map.containsKey(pattern.charAt(i))) { //有這個鍵值 51                     //abcc 52                     //deqq 53                     //好比上面,map.get(c)=q, word.charAt(3)=q,知足條件
54                     if (map.get(pattern.charAt(i))  !=  word.charAt(i)) { //判斷當key值相同的時候,value是否相等
55                         flag = false; 56                         break; 57  } 58                 } else { //不包含關鍵字的時候
59                     if (map.containsValue(word.charAt(i))) { //不存在關鍵字,可是已經存在鍵值映射,就不符合給定的字符串模式
60                         /*abcc 61  meee 62  上面的這種:首先會將a-m、b-e加入map中,而後第三次判斷,鍵c不存在, 63  可是值e已經存在,這是不符合的因此須要剔除這種狀況 64                         */
65                         flag = false; 66                         break; 67  } 68                     //pattern中的每一個字符做爲key值,word中的對應的字符做爲value值
69  map.put(pattern.charAt(i), word.charAt(i)); 70  } 71  } 72             if (flag) 73  res.add(word); 74  map.clear(); 75  } 76         return res; 77  } 78 }
相關文章
相關標籤/搜索