Golang每日一练(leetDay0044)

news2024/11/20 7:14:50

目录

130. 被围绕的区域 Surrounded Regions  🌟🌟

131. 分割回文串 Palindrome Partitioning  🌟🌟

132. 分割回文串 II Palindrome Partitioning II  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


130. 被围绕的区域 Surrounded Regions

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

示例 1:

输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

输入:board = [["X"]]
输出:[["X"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 'X' 或 'O'

代码1: DFS

package main

import (
	"fmt"
)

func solve(board [][]byte) {
	if len(board) == 0 || len(board[0]) == 0 {
		return
	}
	m, n := len(board), len(board[0])
	// 从边界的'O'出发,将与其相连的'O'标记为'A'
	for i := 0; i < m; i++ {
		dfs(board, i, 0)
		dfs(board, i, n-1)
	}
	for j := 0; j < n; j++ {
		dfs(board, 0, j)
		dfs(board, m-1, j)
	}
	// 将未被标记的'O'填充为'X',将标记为'A'的'O'恢复为'O'
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if board[i][j] == 'O' {
				board[i][j] = 'X'
			} else if board[i][j] == 'A' {
				board[i][j] = 'O'
			}
		}
	}
}

func dfs(board [][]byte, i, j int) {
	if i < 0 || i >= len(board) || j < 0 || j >= len(board[0]) || board[i][j] != 'O' {
		return
	}
	board[i][j] = 'A'
	dfs(board, i-1, j)
	dfs(board, i+1, j)
	dfs(board, i, j-1)
	dfs(board, i, j+1)
}

func ArrayToString(arr []byte) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += string(arr[i])
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	board := [][]byte{
		{'X', 'X', 'X', 'X'},
		{'X', 'O', 'O', 'X'},
		{'X', 'X', 'O', 'X'},
		{'X', 'O', 'X', 'X'}}
	solve(board)
	for _, row := range board {
		fmt.Println(ArrayToString(row))
	}
}

输出:

[X,X,X,X]
[X,X,X,X]
[X,X,X,X]
[X,O,X,X]

代码2: BFS

package main

import (
	"fmt"
)

func solve(board [][]byte) {
	if len(board) == 0 || len(board[0]) == 0 {
		return
	}
	m, n := len(board), len(board[0])
	// 从边界的'O'出发,将与其相连的'O'标记为'A'
	queue := make([][2]int, 0)
	for i := 0; i < m; i++ {
		if board[i][0] == 'O' {
			queue = append(queue, [2]int{i, 0})
		}
		if board[i][n-1] == 'O' {
			queue = append(queue, [2]int{i, n - 1})
		}
	}
	for j := 0; j < n; j++ {
		if board[0][j] == 'O' {
			queue = append(queue, [2]int{0, j})
		}
		if board[m-1][j] == 'O' {
			queue = append(queue, [2]int{m - 1, j})
		}
	}
	for len(queue) > 0 {
		i, j := queue[0][0], queue[0][1]
		queue = queue[1:]
		board[i][j] = 'A'
		if i > 0 && board[i-1][j] == 'O' {
			queue = append(queue, [2]int{i - 1, j})
		}
		if i < m-1 && board[i+1][j] == 'O' {
			queue = append(queue, [2]int{i + 1, j})
		}
		if j > 0 && board[i][j-1] == 'O' {
			queue = append(queue, [2]int{i, j - 1})
		}
		if j < n-1 && board[i][j+1] == 'O' {
			queue = append(queue, [2]int{i, j + 1})
		}
	}
	// 将未被标记的'O'填充为'X',将标记为'A'的'O'恢复为'O'
	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if board[i][j] == 'O' {
				board[i][j] = 'X'
			} else if board[i][j] == 'A' {
				board[i][j] = 'O'
			}
		}
	}
}

func ArrayToString(arr []byte) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += string(arr[i])
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	board := [][]byte{
		{'X', 'X', 'X', 'X'},
		{'X', 'O', 'O', 'X'},
		{'X', 'X', 'O', 'X'},
		{'X', 'O', 'X', 'X'}}
	solve(board)
	for _, row := range board {
		fmt.Println(ArrayToString(row))
	}
}

131. 分割回文串 Palindrome Partitioning

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

代码1: 动态规划

package main

import (
	"fmt"
	"strings"
)

func partition(s string) [][]string {
	n := len(s)
	dp := make([][]bool, n)
	for i := range dp {
		dp[i] = make([]bool, n)
	}
	for j := 0; j < n; j++ {
		for i := 0; i <= j; i++ {
			if s[i] == s[j] && (j-i <= 2 || dp[i+1][j-1]) {
				dp[i][j] = true
			}
		}
	}
	res := make([][]string, 0)
	path := make([]string, 0)
	dfs(s, 0, dp, path, &res)
	return res
}

func dfs(s string, start int, dp [][]bool, path []string, res *[][]string) {
	if start == len(s) {
		tmp := make([]string, len(path))
		copy(tmp, path)
		*res = append(*res, tmp)
		return
	}
	for i := start; i < len(s); i++ {
		if dp[start][i] {
			path = append(path, s[start:i+1])
			dfs(s, i+1, dp, path, res)
			path = path[:len(path)-1]
		}
	}
}

func ArrayToString(arr []string) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += arr[i]
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	str := "aab"
	fmt.Println(strings.Join(strings.Fields(fmt.Sprint(partition(str))), ","))
	str = "a"
	fmt.Println(strings.Join(strings.Fields(fmt.Sprint(partition(str))), ","))
}

输出:

[[a,a,b],[aa,b]]
[[a]]

代码2: 回溯

package main

import (
	"fmt"
	"strings"
)

func partition(s string) [][]string {
	res := make([][]string, 0)
	path := make([]string, 0)
	backtrack(s, 0, path, &res)
	return res
}
func backtrack(s string, start int, path []string, res *[][]string) {
	if start == len(s) {
		tmp := make([]string, len(path))
		copy(tmp, path)
		*res = append(*res, tmp)
		return
	}
	for i := start; i < len(s); i++ {
		if isPalindrome(s, start, i) {
			path = append(path, s[start:i+1])
			backtrack(s, i+1, path, res)
			path = path[:len(path)-1]
		}
	}
}

func isPalindrome(s string, start, end int) bool {
	for start < end {
		if s[start] != s[end] {
			return false
		}
		start++
		end--
	}
	return true
}

func ArrayToString(arr []string) string {
	res := "["
	for i := 0; i < len(arr); i++ {
		res += arr[i]
		if i != len(arr)-1 {
			res += ","
		}
	}
	return res + "]"
}

func main() {
	str := "aab"
	fmt.Println(strings.Join(strings.Fields(fmt.Sprint(partition(str))), ","))
	str = "a"
	fmt.Println(strings.Join(strings.Fields(fmt.Sprint(partition(str))), ","))
}

132. 分割回文串 II Palindrome Partitioning II

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。

返回符合要求的 最少分割次数 。

示例 1:

输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1

提示:

  • 1 <= s.length <= 2000
  • s 仅由小写英文字母组成

代码1: 动态规划

package main

import (
	"fmt"
)

func minCut(s string) int {
	n := len(s)
	dp := make([][]bool, n)
	for i := range dp {
		dp[i] = make([]bool, n)
	}
	for j := 0; j < n; j++ {
		for i := 0; i <= j; i++ {
			if s[i] == s[j] && (j-i <= 2 || dp[i+1][j-1]) {
				dp[i][j] = true
			}
		}
	}
	cut := make([]int, n)
	for i := 0; i < n; i++ {
		if dp[0][i] {
			cut[i] = 0
			continue
		}
		cut[i] = i
		for j := 0; j < i; j++ {
			if dp[j+1][i] {
				cut[i] = min(cut[i], cut[j]+1)
			}
		}
	}
	return cut[n-1]
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	str := "aab"
	fmt.Println(minCut(str))
	str = "a"
	fmt.Println(minCut(str))
	str = "ab"
	fmt.Println(minCut(str))
}

输出:

1
0
1

代码2: 动态规划

package main

import (
	"fmt"
)

func minCut(s string) int {
	n := len(s)
	cut := make([]int, n)
	for i := range cut {
		cut[i] = i
	}
	for i := 0; i < n; i++ {
		expand(s, i, i, &cut)
		expand(s, i, i+1, &cut)
	}
	return cut[n-1]
}

func expand(s string, left, right int, cut *[]int) {
	for left >= 0 && right < len(s) && s[left] == s[right] {
		if left == 0 {
			(*cut)[right] = 0
		} else {
			(*cut)[right] = min((*cut)[right], (*cut)[left-1]+1)
		}
		left--
		right++
	}
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	str := "aab"
	fmt.Println(minCut(str))
	str = "a"
	fmt.Println(minCut(str))
	str = "ab"
	fmt.Println(minCut(str))
}

🌟 每日一练刷题专栏 🌟

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

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

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

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

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

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启扬方案:瑞芯微3568智慧安防NVR设备解决方案

物联网技术和人工智能技术的发展和应用&#xff0c;让安防行业的视频监控从简单的看见画面到自动识别智能研判&#xff0c;大大地提高视频监控的智能化&#xff0c;提升监控效率。随着智慧城市、智慧交通、智慧社区等项目的实施&#xff0c;面对道路交通、银行、家庭、商场、楼…

App复杂动画实现——Rive保姆级教程 | 京东云技术团队

作者&#xff1a;京东物流 沈明亮 在App开发过程中&#xff0c;如果想实现动画效果&#xff0c;可以粗略分为两种方式。一种是直接用代码编写&#xff0c;像平移、旋转等简单的动画效果&#xff0c;都可以这么干&#xff0c;如果稍微复杂点&#xff0c;就会对开发工程师的数学功…

如何提升电脑使用体验?试试这5款免费软件吧

今天推荐5款实用的开源软件,它们可以极大地提高你的工作和生活效率,让你办公学习的体验更加舒适。 屏幕截图工具——ShareX ShareX是一款免费的开源软件&#xff0c;可以让你快速地捕捉屏幕上的任何区域&#xff0c;并将其保存为图片或视频文件。你还可以使用ShareX来上传你的…

chatgpt智能提效职场办公-ppt怎么做流程图

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 制作PPT流程图的步骤如下&#xff1a; 打开 PowerPoint&#xff0c;选择自己要制作流程图的PPT页面。 在页面中点击“插入”选项卡&am…

gcc编译的过程

文章目录 前言一、gcc 编译四步骤二、gcc编译常用参数三、文件后缀名对应表四、预处理五、编译六、汇编七、链接1、静态链接2、动态链接 前言 GCC 仅仅是一个编译器&#xff0c;没有界面&#xff0c;必须在命令行模式下使用。通过 gcc 命令就可以将源文件编译成可执行文件。 一…

人机识别技术再升级,AIGC为验证码带来万亿种新变化

网上输入关键词“破解验证码”&#xff0c;会出现1740万个搜索结果。“验证码识别、轻松破解、暴力破解、逻辑漏洞破解、简单破解”等等各类关键词的内容&#xff0c;不一而足&#xff0c;关于“如何用破解某某验证码”的帖子更是多如牛毛。 搜索引擎的相关结果 2017年&#xf…

线程池的构造方式

线程池的构造方式 两类构造方式7种实现方法7种线程池的具体使用FixedThreadPoolCachedThreadPoolSingleThreadExecutorScheduledThreadPoolSingleThreadScheduledExecutornewWorkStealingPoolThreadPoolExecutor 说明总结 两类构造方式 在Java语言中&#xff0c;并发编程都是通…

【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)

&#x1f517; 运行环境&#xff1a;matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

异常详解

一、初识异常 异常概念&#xff1a; 所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制。 而运行时指的是程序已经编译通过得到 class 文件了, 再由 JVM 执行过程中出现的错误。 1.除以 0 System.out.println(10 / 0); // 执行结果 Exception in thread "…

02 - 学会提问

学会提问 一、引言 1.1 GPT简介 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力&#xff0c;GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…

python+vue 高校资助系统

其中各子模块的主要功能如下&#xff1a; 1、用户登录&#xff1a;用户进入系统先输入用户名与密码&#xff0c;选择权限登录&#xff0c;用户登录成功&#xff0c;要记录登录的用户名和登录类型。 2、学生注册&#xff1a;学生注册填写学号、密码、确认密码、学生姓名、邮箱、…

Python小姿势 - Python操作MongoDB数据库

Python操作MongoDB数据库 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 现在&a…

Leetcode力扣秋招刷题路-0295

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 …

springboot,Flowable 流程实例的激活与挂起(二)

一.简介 接上一篇 springboot&#xff0c;Flowable 流程实例的激活与挂起&#xff08;一&#xff09; 二.流程实例的挂起与激活 1.流程实例的挂起 挂起一个流程实例的代码如下&#xff1a; Test void test08() {List<ProcessDefinition> list repositoryService.cr…

Cycling 74 Max for Mac:音乐可视化编程软件

Cycling 74 Max是一款音乐、视觉、互动艺术等领域中广泛使用的编程语言和应用软件&#xff0c;它允许用户创作和控制实时音频和视频效果、交互式应用程序和媒体艺术品等。 Max将程序设计和可视化编程相结合&#xff0c;通过简单的拖拽和连接方式&#xff0c;用户可以将各种功能…

cuda编码例程(转载借鉴)

内容出处&#xff1a;https://mp.csdn.net/mp_blog/creation/editor 1. 前言 这是一份简单的CUDA编程入门&#xff0c;主要参考英伟达的官方文档进行学习&#xff0c;本人也是刚开始学习&#xff0c;如有表述错误&#xff0c;还请指出。官方文档链接如下&#xff1a; An Eve…

第2章-类加载子系统

1、本系列博客&#xff0c;主要是面向Java8的虚拟机。如有特殊说明&#xff0c;会进行标注。 2、本系列博客主要参考尚硅谷的JVM视频教程&#xff0c;整理不易&#xff0c;所以图片打上了一些水印&#xff0c;还请读者见谅。后续可能会加上一些补充的东西。 3、尚硅谷的有些视频…

vue 实现el-select组件 配合 el-tabs 完成动态tabs然后有勾选 全选,还有模拟提交,回显数据

cv即可使用 <!DOCTYPE html> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" conten…

Python读取DataFrame的某行或某列

行索引、列索引、loc和iloc import pandas as pd import numpy as np # 准备数据 df pd.DataFrame(np.arange(12).reshape(3,4),indexlist("abc"),columnslist("WXYZ"))行索引(index)&#xff1a;对应最左边那一竖列 列索引(columns)&#xff1a;对应最…

使用手机在网状态查询 API 有效防止虚假注册的设计思路

引言 随着移动互联网的普及&#xff0c;手机在网状态成为重要的数据指标。在网状态反映了手机用户的实际使用情况&#xff0c;对于各类企业和机构具有重要意义。 本文将为大家介绍手机在网状态 API 的主要特点和优势&#xff0c;并且探讨手机在网状态 API 的应用场景和效果展…