LeetCode-wordPattern(单词模式)

这几天一直在刷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;
	}
}

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41582192/article/details/81589367
今日推荐