156.Word Pattern
题目:
Given a pattern
and a string str
, find if str
follows the same pattern.
给定一个模式和一个字符串str,找到str是否遵循相同的模式。
Here follow means a full match, such that there is a bijection between a letter in pattern
and a non-empty word in str
.
以下是完全匹配,这样在模式中的字母和str中的非空字之间存在双射。
Example 1:
Input: pattern ="abba"
, str ="dog cat cat dog"
Output: true
Example 2:
Input:pattern ="abba"
, str ="dog cat cat fish"
Output: false
Example 3:
Input: pattern ="aaaa"
, str ="dog cat cat dog"
Output: false
Example 4:
Input: pattern ="abba"
, str ="dog dog dog dog"
Output: false
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters separated by a single space.
您可以假设pattern仅包含小写字母,str包含由单个空格分隔的小写字母。
解答:
方法一:建立字母和单词的映射(a->dog)
1 class Solution { 2 public boolean wordPattern(String pattern, String str) { 3 String[] words=str.split(" "); 4 if(words.length!=pattern.length()) 5 return false; 6 Map<Character,String> map=new HashMap<>(); 7 for(int i=0;i<pattern.length();i++){ 8 char c=pattern.charAt(i); 9 if(map.containsKey(c)){ 10 if(!map.get(c).equals(words[i])) //这里不能用!=,!=比较的是地址,equals比较的是值 11 return false; 12 }else{ 13 if(map.containsValue(words[i])) //保证一一映射,值只能对应一个键,不能出现a->dog,b->dog的现象 14 return false; 15 map.put(c,words[i]); 16 } 17 } 18 return true; 19 } 20 }
方法二:分别建立字母和位置的映射,单词和位置的映射
1 class Solution { 2 public boolean wordPattern(String pattern, String str) { 3 String[] words = str.split(" "); 4 if (words.length != pattern.length()) 5 return false; 6 Map map = new HashMap(); 7 for (Integer i=0; i<words.length; i++) 8 if (map.put(pattern.charAt(i), i) != map.put(words[i], i)) 9 return false; 10 return true; 11 } 12 }
详解:
哈希表--映射