LeetCode150道面试经典题--单词规律(简单)

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

 

1.题目

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

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

2.示例

pattern="abba"

s = "cat dog dog cat"

返回 true

pattern="abba"

s = "cat pig dog cat"

返回 false

pattern="ab"

s = "cat cat"

返回 false

提示

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

     

    3.思路

    哈希表:

           首先看到映射相关问题就得联想到哈希表,然后先分析特殊情况,比如s为空或者s里面的字母个数和pattern的个数不匹配则直接返回false,否则正常情况下,先将s通过spilt方法进行切割后,在遍历s情况下,不存在的键值对应的映射就存入哈希表中,存在的就比较是否相等即可。

    如果不了解哈希表则可以通过以下内容了解相关知识

    Java类集框架(二)_Alphamilk的博客-CSDN博客

    4.代码

    LeetCode代码:

    使用时间优先代码:

    class Solution {
        public boolean wordPattern(String pattern, String s) {
    //        判断两种特殊情况
            if (s.length() ==0){
                return false;
            }
            String ss[] = s.split(" ");
            if (ss.length != pattern.length()){
                return false;
            }
    //        正常情况
            HashMap<Character,String> map = new HashMap<>();
            for (int i= 0;i<pattern.length();i++){
                if (!map.containsKey(pattern.charAt(i))){
                    if (map.containsValue(ss[i])){
                        return false;
                    }
                    map.put(pattern.charAt(i),ss[i]);
                }else {
                    if (!map.get(pattern.charAt(i)).equals(ss[i])){
                        return false;
                    }
                }
            }
            return true;
        }
    }

    image.gif

    image.gif编辑 还有一种做法是通过构造两个哈希表实现,内存上稍微会优于该算法,但是时间上会慢一些。

    案例详细代码:

    package LeetCode14;
    import java.util.Arrays;
    import java.util.HashMap;
    public class javaDemo {
        public static void main(String[] args) {
            String pattern = "abbc";
            String s = "";
            boolean flag = true;
    //        判断两种特殊情况
    //        当s为空
            if (s.length() ==0){
                flag = false;
            }
    //        当ss中单词个数与pattern个数不匹配情况
            String ss[] = s.split(" ");
            if (ss.length != pattern.length()){
                flag = false;
            }
    //        正常情况
            HashMap<Character,String> map = new HashMap<>();
    //        遍历整个pattern
            for (int i= 0;i<pattern.length();i++){
    //            判断是否存在键值
                if (!map.containsKey(pattern.charAt(i))){
    //                判断值是否已经对应其他键值
                    if (map.containsValue(ss[i])){
                        flag = false;
                        break;
                    }
    //              不满足前面条件的话就正常放入
                    map.put(pattern.charAt(i),ss[i]);
                }else {
    //                如果有存在的键,则进行比较
                    if (!map.get(pattern.charAt(i)).equals(ss[i])){
                        flag = false;
                        break;
                    }
                }
            }
    //        输出flag
            System.out.println(flag);
        }
    }

    image.gif


    目录
    相关文章
    |
    2天前
    |
    算法
    【数组相关面试题】LeetCode试题
    【数组相关面试题】LeetCode试题
    |
    2天前
    力扣面试经典题之哈希表
    力扣面试经典题之哈希表
    19 0
    |
    2天前
    |
    Java
    【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
    【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
    11 1
    |
    2天前
    |
    算法
    【刷题】 leetcode 面试题 08.05.递归乘法
    递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
    25 4
    【刷题】 leetcode 面试题 08.05.递归乘法
    |
    2天前
    |
    存储 算法 安全
    【刷题】 leetcode 面试题 01.06 字符串压缩
    来看效果: 非常好!!!过啦!!!
    25 5
    【刷题】 leetcode 面试题 01.06 字符串压缩
    |
    2天前
    |
    C++ 索引
    【力扣经典面试题】14. 最长公共前缀
    【力扣经典面试题】14. 最长公共前缀
    |
    2天前
    |
    C++
    【力扣经典面试题】58. 最后一个单词的长度
    【力扣经典面试题】58. 最后一个单词的长度
    |
    2天前
    |
    算法 Java
    【力扣经典面试题】12. 整数转罗马数字
    【力扣经典面试题】12. 整数转罗马数字
    |
    2天前
    |
    索引
    [经典力扣面试题]135. 分发糖果
    [经典力扣面试题]135. 分发糖果
    |
    2天前
    |
    算法 C++ 索引
    【力扣经典面试题】238. 除自身以外数组的乘积
    【力扣经典面试题】238. 除自身以外数组的乘积