LeetCode 算法题【简单】290. 单词规律

语雀原文链接

文章目录

1、LeetCode 链接

plain 复制代码
给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

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

pattern 中的每个字母都 恰好 映射到 s 中的一个唯一单词。
s 中的每个唯一单词都 恰好 映射到 pattern 中的一个字母。
没有两个字母映射到同一个单词,也没有两个单词映射到同一个字母。
 

示例1:

输入: pattern = "abba", s = "dog cat cat dog"
输出: true
示例 2:

输入:pattern = "abba", s = "dog cat cat fish"
输出: false
示例 3:

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

提示:

1 <= pattern.length <= 300
pattern 只包含小写英文字母
1 <= s.length <= 3000
s 只包含小写英文字母和 ' '
s 不包含 任何前导或尾随对空格
s 中每个单词都被 单个空格 分隔

2、个人写法

  • 思路:
  • 在本题中,我们需要判断字符与字符串之间是否恰好一一对应。即任意一个字符都对应着唯一的字符串,任意一个字符串也只被唯一的一个字符对应。在集合论中,这种关系被称为「双射」。
  • 想要解决本题,我们可以利用哈希表记录每一个字符对应的字符串,以及每一个字符串对应的字符。然后我们枚举每一对字符与字符串的配对过程,不断更新哈希表,如果发生了冲突,则说明给定的输入不满足双射关系。
  • 时间复杂度:O(n+m)
  • 空间复杂度:O(n+m)
plain 复制代码
class Solution {
    public boolean wordPattern(String pattern, String s) {

        int length = pattern.length();
        String[] words = s.split(" ");
        if (length != words.length) {
            return false;
        }

        Map<Character, String> map = new HashMap();
        for (int i = 0; i < length; i++) {

            Character key = pattern.charAt(i);
            if (map.containsKey(key)) {
                String value = map.get(key);
                // 这里不能用 != 判断
                if (!value.equals(words[i])) {
                    return false;
                }
            } else {
                if (map.containsValue(words[i])) {
                    return false;
                }
                map.put(key, words[i]);
            }
        }

        return true;

    }
}
相关推荐
5***8464几秒前
Spring Boot的项目结构
java·spring boot·后端
SimonKing几秒前
基于Netty的TCP协议的Socket客户端
java·后端·程序员
程序员飞哥1 分钟前
几年没面试,这次真的被打醒了!
java·面试
Learner12 分钟前
Python异常处理
java·前端·python
AI科技星14 分钟前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
tao35566715 分钟前
VS Code登录codex,报错(os error 10013)
java·服务器·前端
橘颂TA16 分钟前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹18 分钟前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
信创天地21 分钟前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务