前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-01-17:单词规律 II。 给你一种规律 pattern 和一个字符

2022-01-17:单词规律 II。 给你一种规律 pattern 和一个字符

原创
作者头像
福大大架构师每日一题
发布于 2022-01-17 13:40:04
发布于 2022-01-17 13:40:04
1540
举报

2022-01-17:单词规律 II。

给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。

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

力扣291。

答案2022-01-17:

递归。str=abcabc,pattern=xx。先让a=x,再让ab=x,再让abc=x。直到完全匹配为止。

代码用golang编写。代码如下:

代码语言:go
AI代码解释
复制
package main

import "fmt"

func main() {
    ret := wordPatternMatch("abab", "redblueredblue")
    fmt.Println(ret)
}

func wordPatternMatch(pattern, str string) bool {
    return match(str, pattern, 0, 0, make([]string, 26), make(map[string]struct{}))
}

func match(s, p string, si, pi int, map0 []string, set map[string]struct{}) bool {
    if pi == len(p) && si == len(s) {
        return true
    }
    // str和pattern,并没有都结束!
    if pi == len(p) || si == len(s) {
        return false
    }
    //  str和pattern,都没结束!

    //char ch = p.charAt(pi);
    ch := p[pi]
    cur := map0[ch-'a']
    if cur != "" { // 当前p[pi]已经指定过了!
        return si+len(cur) <= len(s) && // 不能越界!
            cur == s[si:si+len(cur)] &&
            match(s, p, si+len(cur), pi+1, map0, set)
    }
    // p[pi]没指定!
    end := len(s)
    // 剪枝!重要的剪枝!
    for i := len(p) - 1; i > pi; i-- {
        //end -= map0[p[i] - 'a'] == nil ? 1 : len(map0[p[i]-'a'])
        if map0[p[i]-'a'] == "" {
            end -= 1
        } else {
            end -= len(map0[p[i]-'a'])
        }

    }
    for i := si; i < end; i++ {
        //  从si出发的所有前缀串,全试
        cur = s[si : i+1]
        // 但是,只有这个前缀串,之前没占过别的坑!才能去尝试
        if _, ok := set[cur]; !ok {
            //set.add(cur);
            set[cur] = struct{}{}
            map0[ch-'a'] = cur
            if match(s, p, i+1, pi+1, map0, set) {
                return true
            }
            map0[ch-'a'] = ""
            //set.remove(cur);
            delete(set, cur)
        }
    }
    return false
}

执行结果如下:

图片
图片

左神java代码

moonfdd

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数
给一个字符串数组strs和一个目标字符串target。target的简写不能跟strs打架。
福大大架构师每日一题
2022/01/22
2630
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。"."匹配单个字符。""匹配左边元素的多个字符。判断p是否匹配s。比如s="ab",p="a.",返回true。比如s="ab",p="a",返回false。比如s="aaa",p="a",返回true。比如s="moonfdd",p="kmoonfdd",返回true,因为"*"表示零个或者多个,这里'k'表示0个。
福大大架构师每日一题
2021/07/02
4510
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str="48((70-65)-43)+81",返回-1816。str="3+14",返回7。str="3+(14)",返回7。【说明】 1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查。2.如果是负数,就需要用括号括起来,比如“4(-3)”但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如"-34"和"(-3*4)"都是合法的。 3.不用考虑计算过程中会发生溢出的情况。
福大大架构师每日一题
2021/05/23
3030
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加
2021-06-05:一个字符串至少需要添加多少个字符能整体变成回文串?
2021-06-05:一个字符串至少需要添加多少个字符能整体变成回文串? 福大大 答案2021-06-05: 动态规划。 si和sj不等时:dpi=min(左边,下边)+1。 si和sj相等时:dpi=左下边。 代码用golang编写。代码如下: package main import "fmt" func main() { s := "moonfdd" ret := minInsertions(s) fmt.Println(ret) } func minInsertion
福大大架构师每日一题
2021/06/05
3720
2021-06-05:一个字符串至少需要添加多少个字符能整体变成回文串?
2022-01-23:力扣425,单词方块。 给定一个单词集合 (没
一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。
福大大架构师每日一题
2022/01/23
2830
2021-12-18:找到字符串中所有字母异位词。 给定两个字符
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
福大大架构师每日一题
2021/12/18
2000
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
福大大架构师每日一题
2021/09/03
4870
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-09-07:单词接龙 II。按字典 wordList 完成从单词 begi
2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列,并满足:每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词 si(1 <= i <= k)必须是字典 wordList 中的单词。注意,beginWord 不必是字典 wordList 中的单词。sk == endWord,给你两个单词 beginWord 和 endWord ,以及一个字典 wordList 。请你找出并返回所有从 beginWord 到 endWord 的 最短转换序列 ,如果不存在这样的转换序列,返回一个空列表。每个序列都应该以单词列表 beginWord, s1, s2, ..., sk 的形式返回。力扣126。
福大大架构师每日一题
2021/09/07
3950
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 bo
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。力扣212。
福大大架构师每日一题
2021/09/05
2730
LeetCode 291. 单词规律 II(回溯)
给你一种规律 pattern 和一个字符串 str,请你判断 str 是否遵循其相同的规律。
Michael阿明
2021/02/19
6810
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
福大大架构师每日一题
2021/06/10
3780
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
​2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成
2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮,‘.’表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮。返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。
福大大架构师每日一题
2021/03/18
5070
​2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成
2024-08-03:用go语言,给定一个从 0 开始的字符串数组 `words`, 我们定义一个名为 `isPrefixAnd
我们定义一个名为 isPrefixAndSuffix 的布尔函数,该函数接受两个字符串参数 str1 和 str2。
福大大架构师每日一题
2024/08/16
1270
2024-08-03:用go语言,给定一个从 0 开始的字符串数组 `words`, 我们定义一个名为 `isPrefixAnd
2021-12-27:给定一个字符串str,和一个正数k, str子序列
假设有3种字符,k=2,那么种类上就是3取2,然后2种字符词频,求2的n次方相乘,最后累加。
福大大架构师每日一题
2021/12/27
2300
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str="48*((70-65)-43)+8*1",返回-1816。str="3+1*4",返回7。str="3+(1*4)",返回7。【说明】 1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查。2.如果是负数,就需要用括号括起来,比如“4*(-3)”但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如"-3*4"和"(-3*4)"都是合法的。3.不用考虑计算过程中会发生溢出的情况。
福大大架构师每日一题
2021/08/05
8070
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个最短子串,能包含str2的所有字符,字符顺序无所谓,str1的这个最短子串也可以包含多余的字符。返回这个最短包含子串。
福大大架构师每日一题
2021/08/30
9430
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。
福大大架构师每日一题
2023/11/30
3430
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的
2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包
2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。力扣140。
福大大架构师每日一题
2021/10/16
3040
2022-01-29:连接词。 给你一个 不含重复 单词的字符串数组
给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。
福大大架构师每日一题
2022/01/29
3110
2021-08-15:给定一个字符串Str,返回Str的所有子序列中
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
福大大架构师每日一题
2021/08/15
8780
2021-08-15:给定一个字符串Str,返回Str的所有子序列中
推荐阅读
2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数
2630
2021-07-02:正则表达式匹配。给定一个字符串s和一个匹配串p。“.“匹配单个字符
4510
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加
3030
2021-06-05:一个字符串至少需要添加多少个字符能整体变成回文串?
3720
2022-01-23:力扣425,单词方块。 给定一个单词集合 (没
2830
2021-12-18:找到字符串中所有字母异位词。 给定两个字符
2000
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
4870
2021-09-07:单词接龙 II。按字典 wordList 完成从单词 begi
3950
2021-09-05:单词搜索 II。给定一个 m x n 二维字符网格 bo
2730
LeetCode 291. 单词规律 II(回溯)
6810
2021-06-10:一个字符串用最少刀数切出来的子串都是回文串,返回所有划分结果 。
3780
​2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成
5070
2024-08-03:用go语言,给定一个从 0 开始的字符串数组 `words`, 我们定义一个名为 `isPrefixAnd
1270
2021-12-27:给定一个字符串str,和一个正数k, str子序列
2300
2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难
8070
2021-08-30:给定两个字符串str1和str2,在str1中寻找一个
9430
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的
3430
2021-10-16:单词拆分 II。给定一个非空字符串 s 和一个包
3040
2022-01-29:连接词。 给你一个 不含重复 单词的字符串数组
3110
2021-08-15:给定一个字符串Str,返回Str的所有子序列中
8780
相关推荐
2022-01-22:力扣411,最短独占单词缩写。 给一个字符串数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档