Leetcode第290题单词规律(哈希表超简单解法)

个人觉得这道题的官方解法并不易于理解,故在此给出了一种易于理解的解法

1.题目:

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

2.思路:

(1)解读题意,是否符合规律即:将字符串pattern划分为一个个字符,将s按空格划分为一个个单词,一个字符只对应一个单词,一个单词也只对应一个字符

(2)一一对应的关系,很明显,可以用哈希表来反映两两之间的映射关系

(3)将pattern转化为字符数组,将s按空格划分转化为字符串数组

(4)如果两个数组的长度不一样,说明一定不符合规律,直接返回false

(5)用for循环遍历两个字符数组,边遍历边用两个哈希表来存储新的映射关系,判断如果遇到哈希中已经存在的键,判断键值是否相等,不相等则返回false,注意两个哈希都要判断,避免出现s中全为同一个单词的情况

(6)全部遍历完,均未返回false,则说明符合规律,最后返回true

3.Java代码实现:

public static boolean wordPattern(String pattern, String s) {

//        将字符串按空格为划分标准,依次将子字符串存入字符串数组

        String[] str = s.split(" ");

//        将pattern存入字符型数组

        char[] ch = pattern.toCharArray();

//        如果两个数组长度不相等,则一定不符合规律

        if(str.length != ch.length){

            return false;

        }

//        只建立一个哈希表无法判断s中全为同一个单词的情况

//        要双向判断

        Map hashMap1 = new HashMap<>();

        Map hashMap2 = new HashMap<>();



        for (int i = 0; i < ch.length; i++) {

//            先判断第一个哈希表

            if(hashMap1.containsKey(ch[i])){

                if(!str[i].equals(hashMap1.get(ch[i]))){

                    return false;

                }

            }

//            同样的方法判断第二个

            if(hashMap2.containsKey(str[i])){

                if(!hashMap2.get(str[i]).equals(ch[i])){

                    return false;

                }

            }

//            没有遇到存储过的,就将新的双向连接存入哈希

            hashMap1.put(ch[i],str[i]);

            hashMap2.put(str[i],ch[i]);

        }

        return true;

    }

}

你可能感兴趣的:(题解,数据结构,java,算法,哈希表)