题目:
Given a pattern
and a string str
, find if str
follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern
and a non-empty word in str
.
Examples:
- pattern =
"abba"
, str ="dog cat cat dog"
should return true. - pattern =
"abba"
, str ="dog cat cat fish"
should return false. - pattern =
"aaaa"
, str ="dog cat cat dog"
should return false. - pattern =
"abba"
, str ="dog dog dog dog"
should return false.
Notes:
You may assume pattern
contains only lowercase letters, and str
contains lowercase letters separated by a single space.
题意:
这道题的意思是给一个字符串形式的pattern,然后给定一个字符串,看这个字符串中的每一个单词是否都对应前一个字符串中的pattern。LZ一开始拿到这题,没有什么思路,后来经过同学指导,想到了一种绝妙的方法,那就是采用一个map和set来做,首先这个map是用来表示将每一次的这个pattern中的每一个字母和str字符串中的每一个单词进行一一对应,然后额外再维护一个set,是用来检查每一个已经有的字母所对应的单词是不是一致,如果不一致,那么就直接return false;但是这里还是有一种例外,需要当心,那就是abba,但是输入的单词是dog dog dog dog,这种情况也是返回false,也就是说一开始在要将pattern中的字母压入set中时,也要判断str对应位置的单词是否与map中已有的value一致,如果一致,那么说明就是错的,所以直接return false。考虑到用map和set来维护,是非常简单,尤其是用map,采用哈希表的一一对应的特点,能非常方便的实现这个功能。
public class Solution
{
public static boolean wordPattern(String pattern,String str)
{
Map<Character,String> map = new HashMap<Character,String>();
Set<Character> set = new HashSet<Character>();
int length1 = pattern.length();
String[] string = str.split(" "); //用空格来进行分割,然后分割后的结果是字符串数组
int length2 = string.length;
if(length1 != length2)
return false;
else
{
int i = 0;
for(i = 0; i < length1; i++)
{
if(!set.contains(pattern.charAt(i)))
{
set.add(pattern.charAt(i));
if(map.containsValue(string[i]))
return false;
else
map.put(pattern.charAt(i), string[i]);
}
else
{
if(!(map.get(pattern.charAt(i)).equals(string[i])))
return false;
}
}
}
return true;
}
}