单词规律

290. 单词规律

1 题目描述

​ 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例:

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

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

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

输入: pattern = "abba", str = "dog dog dog dog"
输出: false

2 题目分析

​ 还是练题练得少啊,一个简单题目,思路是有的代码写起来坎坷的要命。理一理思路吧。

​ 根据题意,我们主要是判断字符串str是否满足pattern模式,那么我们可以用一个哈希表来存储这种对应关系,即创建一个哈希表键值对分别是:pattern中的第i个元素和str中的第i个单词,如果第一次出现这种模式则存入到哈希表中,之后只需要在哈希表中查找是否有这种模式即可解决该问题。简要分析到这里,代码大致流程如下:

  1. 将字符串str按照空格进行分割
  2. 如果分割出来的长度不等于pattern的长度,直接返回false
  3. 创建一个哈希表
  4. 对pattern进行遍历
    1. 如果map中不存在pattern.charAt(i)对应的value:那么就可以分情况进行下一步操作,即如果str[i]不存在map中,则将该键值对放入map,否则表示该值已经与其他模式匹配上了,返回false即可
    2. 如果存在pattern.charAt(i)对应的value:只需判断map中的value和str[i]是否相等,不相等则表明不匹配,同样返回false,相等则继续遍历
  5. 遍历结束,返回true

注:稍微有点绕,其实相当于我们要双向判断,既要判断pattern.charAt(i)在map中是否有记录,如果没有记录又要判断str[i]在map中是否有记录,带着这样的想法去理解流程就清晰多了。

3 代码

class Solution {
    public boolean wordPattern(String pattern, String s) {
        // 按照空格分隔s
        String[] str = s.split(" ");
        int len = pattern.length();
        // 如果长度不一致返回false
        if (str.length != pattern.length()) return false;
        // 创建一个key:pattern.charAt(i);value:str[i]的哈希表
        Map<Character, String> hash = new HashMap<>();
        for (int i = 0; i < len; i++) {
            if(hash.get(pattern.charAt(i)) == null) { // map中不存在该键对应的值:放入或者返回false
                if(!hash.containsValue(str[i])) {  // str[i]不存在map则放入
                    hash.put(pattern.charAt(i), str[i]);
                }else {
                    // 存在,说明该值在map中已经有其他对应的键了,已经不匹配了
                    return false;
                }
            } else {  // map中存在该键对应的值
                // 判断该键对应的值是否和str[i]相等,不相等则返回false
                if (!hash.get(pattern.charAt(i)).equals(str[i])) {
                    return false;
                }
            }
        }
        return true;
    }
}

4 优化

​ 这种解法时间复杂度有点高,可以参考官方题解的双map解法,这里就不列出来了。

你可能感兴趣的:(LeetCode刷题,#,简单,leetcode,算法)