AC Leetcode 290. 单词规律

简介: AC Leetcode 290. 单词规律

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

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

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

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

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

解题思路

1)在本题中,我们需要判断字符与字符串之间是否恰好一一对应。即任意一个字符都对应着唯一的字符串,任意一个字符串也只被唯一的一个字符对应。在集合论中,这种关系被称为「双射」。
2)想要解决本题,我们可以利用哈希表记录每一个字符对应的字符串,以及每一个字符串对应的字符。然后我们枚举每一对字符与字符串的配对过程,不断更新哈希表,如果发生了冲突,则说明给定的输入不满足双射关系。

import java.util.HashMap;

class Solution {
    public boolean wordPattern(String pattern, String s) {
        if (s == null || pattern == null) {
            return false;
        }

        String[] str = s.split("\\s");
        if (pattern.length() == str.length) {
            HashMap<Character, String> map = new HashMap<Character, String>();
            HashMap<String, Character> map1 = new HashMap<String, Character>();

            for (int i = 0; i < pattern.length(); i++) {
                if (map.containsKey(pattern.charAt(i))) {
                    if (!str[i].equals(map.get(pattern.charAt(i)))) {
                        return false;
                    }
                } else {
                    map.put(pattern.charAt(i), str[i]);
                }
                
                if (map1.containsKey(str[i])) {
                    if (pattern.charAt(i) != map1.get(str[i])) {
                        return false;
                    }
                } else {
                    map1.put(str[i], pattern.charAt(i));
                }
            }
            return true;
        } else {
            return false;
        }
    }
}
目录
相关文章
|
6天前
|
测试技术
leetcode-1592:重新排列单词间的空格
leetcode-1592:重新排列单词间的空格
27 0
|
7月前
代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词
代码随想录 Day7 字符串1 LeetCode T344反转字符串 T541 反转字符串II 151翻转字符串的单词
30 0
|
6天前
|
自然语言处理 Go
golang力扣leetcode 720.词典中最长的单词
golang力扣leetcode 720.词典中最长的单词
21 0
|
6天前
|
Go
golang力扣leetcode 139.单词拆分
golang力扣leetcode 139.单词拆分
20 0
|
6天前
|
Java
557. 反转字符串中的单词 III --力扣 --JAVA
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
30 0
|
6天前
|
存储 自然语言处理 算法
☆打卡算法☆LeetCode 211. 添加与搜索单词 - 数据结构设计 算法解析
☆打卡算法☆LeetCode 211. 添加与搜索单词 - 数据结构设计 算法解析
|
6天前
|
测试技术
每日一题 --- 力扣318----最大单词长度乘积
每日一题 --- 力扣318----最大单词长度乘积
|
6天前
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
剑指Offer LeetCode 面试题58 - I. 翻转单词顺序
23 0
|
6月前
|
算法
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
代码随想录算法训练营第八天 | LeetCode 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
47 0
|
算法 Java API
力扣151 - 反转字符串中的单词【双指针与字符串的火花】
字符串与双指针也能擦除火花,算法图解带你手撕双指针
122 0
力扣151 - 反转字符串中的单词【双指针与字符串的火花】