Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

这篇具有很好参考价值的文章主要介绍了Golang每日一练(leetDay0099) 单词规律I\II Word Pattern。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

目录

290. 单词规律 Word Pattern  🌟 

291. 单词规律 II Word Pattern ii  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


290. 单词规律 Word Pattern

给定一种规律 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:

package main

import (
	"fmt"
	"strings"
)

func wordPattern(pattern string, s string) bool {
	words := strings.Split(s, " ")
	if len(pattern) != len(words) {
		return false
	}
	p2s := make(map[byte]string)
	s2p := make(map[string]byte)
	for i := 0; i < len(pattern); i++ {
		p, w := pattern[i], words[i]
		if s, ok := p2s[p]; ok {
			if s != w {
				return false
			}
		} else {
			if _, ok := s2p[w]; ok {
				return false
			}
			p2s[p] = w
			s2p[w] = p
		}
	}
	return true
}

func main() {
	pattern := "abba"
	s := "dog cat cat dog"
	fmt.Println(wordPattern(pattern, s))
	pattern = "abba"
	s = "dog cat cat fish"
	fmt.Println(wordPattern(pattern, s))
	pattern = "aaaa"
	s = "dog cat cat dog"
	fmt.Println(wordPattern(pattern, s))
}

代码2: 

package main

import (
	"fmt"
	"strings"
)

func wordPattern(pattern string, s string) bool {
    words := strings.Split(s, " ")
    if len(pattern) != len(words) {
        return false
    }
    p2s := make(map[byte]string)
    used := make(map[string]bool)
    for i := 0; i < len(pattern); i++ {
        p, w := pattern[i], words[i]
        if s, ok := p2s[p]; ok {
            if s != w {
                return false
            }
        } else {
            if used[w] {
                return false
            }
            p2s[p] = w
            used[w] = true
        }
    }
    return true
}

func main() {
	pattern := "abba"
	s := "dog cat cat dog"
	fmt.Println(wordPattern(pattern, s))
	pattern = "abba"
	s = "dog cat cat fish"
	fmt.Println(wordPattern(pattern, s))
	pattern = "aaaa"
	s = "dog cat cat dog"
	fmt.Println(wordPattern(pattern, s))
}

输出:

true
false
false


291. 单词规律 II Word Pattern ii

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

这里我们指的是 完全遵循,例如 pattern  里的每个字母和字符串  str  中每个 非空 单词之间,存在着 双射 的对应规律。双射 意味着映射双方一一对应,不会存在两个字符映射到同一个字符串,也不会存在一个字符分别映射到两个不同的字符串。

示例1:

输入: pattern = "abab", str = "redblueredblue"
输出: true
解释:一种可能的映射如下:'a'->"red",'b'->"blue"

示例 2:

输入: pattern = "aaaa", str = "asdasdasdasd"
输出: true
解释:一种可能的映射如下:'a'->"asd"

示例 3:

输入: pattern = "abab", str = "asdasdasdasd"
输出: true
解释:一种可能的映射如下:'a'->"a",'b'->"sdasd"
注意 'a' 和 'b' 不能同时映射到 "asd",因为这里的映射是一种双射。

示例 4:

输入: pattern = "aabb", str = "xyzabcxzyabc"
输出: false

提示:

  • 1 <= pattern.length <= 300
  • pattern 和 str 都只会包含小写字母
  • 1 <= str.length <= 3000

代码1: 回溯法

package main

import (
	"fmt"
	"strings"
)

func wordPatternMatch(pattern string, str string) bool {
	return backtrack(pattern, str, make(map[string]string), make(map[string]bool))
}

func backtrack(pattern, str string, dict map[string]string, used map[string]bool) bool {
	if pattern == "" {
		return str == ""
	}
	char := string(pattern[0])
	if word, ok := dict[char]; ok {
		if !strings.HasPrefix(str, word) {
			return false
		}
		return backtrack(pattern[1:], str[len(word):], dict, used)
	}
	for i := 1; i <= len(str); i++ {
		word := str[:i]
		if used[word] {
			continue
		}
		dict[char] = word
		used[word] = true
		if backtrack(pattern[1:], str[i:], dict, used) {
			return true
		}
		delete(dict, char)
		delete(used, word)
	}
	return false
}

func main() {
	fmt.Println(wordPatternMatch("abab", "redblueredblue"))
	fmt.Println(wordPatternMatch("aaaa", "asdasdasdasd"))
	fmt.Println(wordPatternMatch("abab", "asdasdasdasd"))
	fmt.Println(wordPatternMatch("aabb", "xyzabcxzyabc"))
}

代码2: 哈希表

package main

import (
	"fmt"
	"strings"
)

func wordPatternMatch(pattern string, s string) bool {
    p2s := make(map[byte]string)
    s2p := make(map[string]byte)
    var match func(int, int) bool
    match = func(pi, si int) bool {
        if pi == len(pattern) {
            return si == len(s)
        }
        p, ok := p2s[pattern[pi]]
        if ok {
            if !strings.HasPrefix(s[si:], p) {
                return false
            }
            return match(pi+1, si+len(p))
        }
        var word string
        for i := si; i < len(s); i++ {
            word = s[si : i+1]
            _, ok = s2p[word]
            if !ok {
                p2s[pattern[pi]] = word
                s2p[word] = pattern[pi]
                if match(pi+1, i+1) {
                    return true
                }
                delete(p2s, pattern[pi])
                delete(s2p, word)
            }
        }
        return false
    }
    return match(0, 0)
}

func main() {
	fmt.Println(wordPatternMatch("abab", "redblueredblue"))
	fmt.Println(wordPatternMatch("aaaa", "asdasdasdasd"))
	fmt.Println(wordPatternMatch("abab", "asdasdasdasd"))
	fmt.Println(wordPatternMatch("aabb", "xyzabcxzyabc"))
}

输出:

true
true
true
false


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

Golang每日一练 专栏

(2023.3.11~)更新中...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更文章来源地址https://www.toymoban.com/news/detail-500213.html

到了这里,关于Golang每日一练(leetDay0099) 单词规律I\II Word Pattern的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang每日一练(leetDay0075) 打家劫舍II、最短回文串

    目录 213. 打家劫舍 II House Robber ii  🌟🌟 214. 最短回文串 Shortest Palindrome  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的

    2024年02月06日
    浏览(46)
  • Golang每日一练(leetDay0004)

    目录 10. 正则表达式匹配 Regular Expression Matching  🌟🌟🌟 11. 盛最多水的容器 Container with most water  🌟🌟 12. 整数转罗马数字 Integer to Roman  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一个字符串 

    2023年04月08日
    浏览(67)
  • Golang每日一练(leetDay0031)

    目录 91. 解码方法  Decode Ways  🌟🌟 93. 复原 IP 地址 Restore IP Addresses  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 注:92.题 移到206.题之后 92. 反转链表 II Reverse Linked List II 一条包含字母  A-Z  的消息通过以

    2023年04月19日
    浏览(82)
  • Golang每日一练(leetDay0022)

    目录 64. 最小路径和 Minimum Path Sum  🌟🌟 65. 有效数字 Valid Number  🌟🌟🌟 66. 加一 Plus One  🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给定一个包含非负整数的  m  x  n  网格  grid  ,请找出一条从左上角到

    2023年04月21日
    浏览(43)
  • Golang每日一练(leetDay0052)

    目录 153. 寻找旋转排序数组中的最小值 Find Minimum In Rotated Sorted Array  🌟🌟 154. 寻找旋转排序数组中的最小值 II Find Minimum In Rotated Sorted Array II  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 已知一个长度为

    2024年02月02日
    浏览(37)
  • Golang每日一练(leetDay0116) 路径交叉、回文对

    目录 335. 路径交叉 Self-crossing  🌟🌟🌟 336. 回文对 Palindrome Pairs  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 给你一个整数数组  distance   。 从  X-Y  平面上的点  (0,0)  开始,先向北

    2024年02月12日
    浏览(39)
  • Golang每日一练(leetDay0049) 二叉树专题(9)

    目录 144. 二叉树的前序遍历 Binary-tree Preorder Traversal  🌟 145. 二叉树的前序遍历 Binary-tree Postorder Traversal  🌟 对比: 94. 二叉树的中序遍历 Binary-tree Inorder Traversal  🌟 146. LRU缓存 LRU Cache  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一

    2024年02月04日
    浏览(42)
  • Golang每日一练(leetDay0065) 位1的个数、词频统计

    目录 191. 位1的个数 Nnumber of 1-bits  🌟 192. 统计词频 Word Frequency  🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为

    2024年02月06日
    浏览(65)
  • Golang每日一练(leetDay0102) 删除无效的括号、累加数

    目录 295. 数据流的中位数 Find-median-from-data-stream 🌟🌟🌟 301. 删除无效的括号 Remove Invalid Parentheses 🌟🌟🌟 306. 累加数 Additive Number 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 中位数 是有

    2024年02月10日
    浏览(46)
  • Golang每日一练(leetDay0098) 生命、Nim、猜数字游戏

    目录 289. 生命游戏 Game Of Life  🌟🌟 292. Nim 游戏 Nim Game  🌟 299. 猜数字游戏 Bulls and Cows  🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 生命游戏   是英国数学家约翰·何顿·康威在 1970 年发

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包