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第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
    22 0
    |
    2月前
    【LeetCode 20】151.反转字符串里的单词
    【LeetCode 20】151.反转字符串里的单词
    20 0
    |
    4月前
    |
    开发者 索引 Python
    这些年背过的面试题——LeetCode
    本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
    |
    4月前
    |
    算法
    LeetCode第58题最后一个单词的长度
    LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
    LeetCode第58题最后一个单词的长度
    |
    4月前
    |
    算法 JavaScript Python
    【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
    Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
    53 4
    |
    4月前
    |
    Python
    【Leetcode刷题Python】生词本单词整理
    文章提供了一个Python程序,用于帮助用户整理和排版生词本上的单词,包括去除重复单词、按字典序排序,并按照特定的格式要求进行打印排版。
    47 3
    |
    4月前
    |
    Python
    【Leetcode刷题Python】318. 最大单词长度乘积
    本文提供了LeetCode题目318的Python编程解决方案,题目要求在一个字符串数组中找出两个不含有公共字母的单词,且这两个单词的长度乘积最大,如果不存在这样的两个单词,则返回0。
    21 0
    |
    5月前
    |
    Python
    155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
    155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
    |
    5月前
    |
    存储 算法 索引
    1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
    1124. 表现良好的最长时间段 (python) 前缀和 分类讨论 最大长度 力扣 面试题
    |
    5月前
    |
    存储 算法
    经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
    经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)