这几天一直在刷LeetCode,看到一道很有意思的题。
下面来看题干要求
给定一种 pattern(模式)
和一个字符串 str
,判断 str
是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern
里的每个字母和字符串 str
中的每个非空单词之间存在着双向连接的对应模式。
输入:pattern = "abba" str = 'dog cat cat fish" 输出:false
输入:pattern = "abba" str="dog cat cat dog" 输出:false
从例子中我们能够看出,实际上就是要求我们按照字母的顺序对比单词。我们很容易联想到字母和单词是一一映射的关系,我们可以通过使用哈希表来处理这个题目。
我们首先要将每个字母和单词一一对应,存入Map中,我们知道,Map中不允许有相同的键出现,当键相同时,值会覆盖之前的内容。这个特点可以让我们很容易处理这个问题,当一个键出现第二次后,我们只需要比较该键两次对应的值是否相同,如果不相同则直接返回false,如果相同则继续向后检查。
下面是代码实现:
package Easy;
import java.util.HashMap;
//290
public class wordPattern {
public static boolean solution(String pattern, String str) {
boolean res = true;
int index = 0;
// 根据空格分割
String[] stringArray = str.split(" ");
char[] charArray = pattern.toCharArray();
// 因为HashMap不接受基本数据类型,所以需要将char转换为String
String[] newArray = new String[charArray.length];
for (int i = 0; i < charArray.length; i++) {
newArray[i] = String.valueOf(charArray[i]);
}
if (charArray.length != stringArray.length) {
return false;
}
// 构建HashMap
HashMap<String, String> exMap = new HashMap<>();
// 全部遍历完成或者出现同键不同值得情况下跳出循环
while (index < stringArray.length) {
// 如果该键第一次出现,则插入键值对
if (exMap.get(newArray[index]) == null) {
exMap.put(newArray[index], stringArray[index]);
index++;
} else {
// 如果键值对存在,则先对值进行比较,如果值相同则继续遍历
// 如果不同,则直接跳出循环
//获得该键之前存在的值
String value = exMap.get(newArray[index]);
//如果两次的对应的值不相同,直接跳出循环
if (value.equals(stringArray[index]) == false) {
return false;
}
//两次相同,取一下对键值对继续检查
if (value.equals(stringArray[index]) == true) {
index++;
}
}
}
return true;
}
}
扫描二维码关注公众号,回复:
2835501 查看本文章