Question:
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与字符串str,确认str是否与pattern匹配。str与pattern匹配代表字符串str中的单词与pattern中的字符一一对应。str中单词使用空格分隔。
如:
- pattern =
"abba"
, str ="dog cat cat dog"
匹配 - pattern =
"abba"
, str ="dog cat cat fish"
不匹配 - pattern =
"aaaa"
, str ="dog cat cat dog"
不匹配 - pattern =
"abba"
, str ="dog dog dog dog"
不匹配
思路:
创建一个 Map<String, Character> map = new HashMap<String, Character>(),建立单词到pattern字符的映射。另外采用一个boolean[] used_char数组,标识Pattern中字符是否已经被使用。
1. 若pattern长度与str中单词个数不同,直接返回不匹配。
2. 若str中当前单词未在Map中出现过,那么判断当前pattern字符是否被使用,因为要求单词与字符一一对应。若已被使用,那么匹配不成功。若未被使用,添加一个<string,char>对到map中。
3. 若str中当前单词已经Map中,则当前单词已经存在键值对,那么判断当前pattern字符是否与Map中与此单词对于的字符相同。不同的话,返回不匹配。
class Solution {
public boolean wordPattern(String pattern, String str) {
Map<String, Character> map = new HashMap<String, Character>(); //建立单词->字符 str->pattern的map
boolean[] used_char = new boolean[128]; //存储当前pattern的字符有没有被使用
int pos = 0;
for(int i=0; i<pattern.length(); i++)
{
used_char[pattern.charAt(i)] = false; //pattern的字符初始全设为没使用过
}
String[] s = str.split(" ");
if(s.length != pattern.length()) //str单词数不等于pattern长度,返回匹配失败
return false;
for(int i=0; i<s.length;i++)
{
if(map.containsKey(s[i]) != true)//如果单词未出现在map中
{
if(used_char[pattern.charAt(pos)] == true) //但是当前pattern字符已经被配对过
return false;
else
{
map.put(s[i],pattern.charAt(pos));//插入单词与pattern的配对关系
used_char[pattern.charAt(pos)] = true;
}
}
else
{
if(map.get(s[i]) != pattern.charAt(pos)) //如果单词已经出现在了map中,但是map中单词匹配的char与pattern当前字符不同
return false;
}
pos++;
}
return true;
}
}
博主学习笔记,转载请注明出处,谢谢~