力扣0087——扰乱字符串

扰乱字符串

难度:困难

题目描述

使用下面描述的算法可以扰乱字符串 s 得到字符串 t

  1. 如果字符串的长度为 1 ,算法停止
  2. 如果字符串的长度 > 1 ,执行下述步骤:
    • 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 xy ,且满足 s = x + y
    • 随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x
    • xy 这两个子字符串上继续从步骤 1 开始递归执行此算法。

给你两个 长度相等 的字符串 s1s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 true ;否则,返回 false

示例1

输入: s1 = “great”, s2 = “rgeat”
输出: true

示例2

输入: s1 = “abcde”, s2 = “caebd”
输出: false

示例3

输入: s1 = “a”, s2 = “a”
输出: true

题解

直接使用动态规划来解题,原始的递归方法中存在大量的重复操作,从而使时间复杂度大幅提高,这时可以使用一个三维数组dp[i][j][k]来记录,i表示s1起始位置,j表示s2起始位置,k表示当前字符串的长度
转移方程如下:
dp[i,j,k] = (dp[i,j,m] && dp[i+m,j+m,k-m]) || (dp[i,j+k-m,m] && dp[i+m,j,k-m])
其中m的取值范围是[1,k)。这表示切割位置可以在1到k之间选择。

想法代码

using System;
using System.Net.Http.Headers;class Solution
{List<List<string>> strings = new List<List<string>>();public static void Main(string[] args){string s1 = "great";string s2 = "rgeat";Solution solution = new Solution();bool ans = solution.IsScramble(s1, s2);Console.WriteLine(ans);}public bool IsScramble(string s1, string s2){if (s1.Equals(s2)){return true;}int length = s1.Length;int[,,] dp = new int[length, length, length + 1];for (int k = 1; k <= length; k++){for (int i = 0; i <= length - k; i++){for (int j = 0; j <= length - k; j++){if (k == 1){dp[i, j, k] = s1[i] == s2[j] ? 1 : 0;continue;}for (int m = 1; m < k; m++){if ((dp[i, j, m] == 1 && dp[i + m, j + m, k - m] == 1) || (dp[i, j + k - m, m] == 1 && dp[i + m, j, k - m] == 1)){dp[i, j, k] = 1;break;}}}}}return dp[0, 0, length] == 1;}
}

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

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

相关文章

c# cad PromptSelectionResult批量选择 PromptEntityOptions选择单个实体介绍

一、PromptSelectionResult &#xff1a; 是 AutoCAD .NET API 中的一个类&#xff0c;位于 Autodesk.AutoCAD.EditorInput 命名空间下。它代表了用户在 AutoCAD 编辑器中进行图形对象选择操作的结果。 当你通过 Editor 类的 GetSelection() 方法&#xff08;或者其他类似的方…

MySQL JSON数据类型全解析(JSON datatype and functions)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的信息交换格式&#xff0c;其简单易读且非常适合程序处理。MySQL从5.7版本开始支持JSON数据类型&#xff0c;本文对MySQL中JSON数据类型的使用进行一个总结。 目录 一、MySQL中的JSON 1.1 JSON数据格式 1.2 …

11. 发送邮件

1. 简介 Spring Boot 收发邮件最简便方式是通过 spring-boot-starter-mail。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>spring-boot-starter-mail 本质…

hive - explode 用法以及练习

hive explode 的用法以及练习 一行变多行 explode 例如&#xff1a; 临时表 temp_table &#xff0c;列名为1st 1st1,2,34,5,6 变为 1 2 3 4 5 6 方式一&#xff1a;直接使用 explode select explode(split(1st,,)) from temp_table;方式二&#xff1a;使用 lateral view…

spring-boot-starter-validation常用注解

文章目录 一、使用二、常用注解三、Valid or Validated &#xff1f;四、分组校验1. 分组校验的基本概念2. 定义验证组3. 应用分组到模型4. 在控制器中使用分组5. 总结 一、使用 要使用这些注解&#xff0c;首先确保在你的 Spring Boot 应用的 pom.xml 文件中添加了 spring-bo…

Java问题排查工具集

Java 问题排查工具箱 n 默认值相关问题 l -XX:PrintFlagsFinal || jinfo -flags n 类装载相关问题 l -XX:TraceClassLoading n 应用无响应相关问题 l sar 等系统指标 l jstack [-l] [-m] Java 问题排查工具箱 n 内存相关问题 l -XX:HeapDumpOnOutOfMemoryEr…

探秘Dmail:Web3世界的通讯引领者

摘要&#xff1a;在一个充满潜力并且对创新要求严格的领域中&#xff0c;Dmail作为一种开创性的Web3通讯协议应运而生。 1月24日&#xff0c;OKX Jumpstart宣布上线Dmail&#xff0c;在Web3领域引起了巨大反响&#xff0c;这是一个旨在重新定义数字通讯范式的富有远见的项目&a…

#资源#llm训练 获取数据集的网站

llm训练需要获取数据&#xff0c;互联网上会有一些别人开源的数据集&#xff0c;我们可以拿来即用 https://github.com/huggingface/datasets https://huggingface.co/datasets 支持使用python直接调取&#xff0c;譬如squad_dataset load_datasets(“squad”)。 https://dat…

【c++学习】数据结构中的栈

c栈 栈代码用线性表实现栈用链表实现栈 栈 栈&#xff1a;先进后出 只对栈顶元素进行操作&#xff0c;包括新元素入栈、栈顶元素出栈和查看栈顶元素&#xff08;只支持对栈顶的增、删、查&#xff09;。 代码 下述代码实现了栈及其接口 包括对栈顶的增、删、查以及查看栈的大…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-1最优控制问题与性能指标 1. 最优控制问题与性能指标2. 动态规划 Dynamic Programming2.1 基本概念2.2 代码详解2.3 简单一维案例 3. 线性二次型调节器&#xff…

Linux date命令详解:如何设置、更改、格式化和显示日期时间(附实例与注意事项)

Linux date命令介绍 date命令在Linux中用来显示和设置系统日期和时间。这个命令允许用户以不同的格式打印时间&#xff0c;也可以计算未来和过去的日期。 Linux date命令适用的Linux版本 date命令在所有主流的Linux发行版中都可以使用&#xff0c;包括但不限于Debian、Ubunt…

GIt同时存在传入和传出更改修改,无法合并

前言 Git是常用的版本管理工具&#xff0c;之前面试被问到过一次——Git有无遇到过使用错误情况&#xff1f;当时卡壳了没答上来&#xff0c;所以这次遇到&#xff0c;特此记录学习。 问题概述 前一天提交了代码&#xff0c;mt进行了修改。但我忘记拉取最新&#xff0c;就进…

bxCAN 标识符筛选

标识符筛选 在 CAN 协议中&#xff0c;消息的标识符与节点地址无关&#xff0c;但与消息内容有关。因此&#xff0c;发送器将消息广播给所有接收器。在接收到消息时&#xff0c;接收器节点会根据标识符的值来确定软件是否需要该消息。如果需要&#xff0c;该消息将复制到 SRAM…

每日一题 力扣2865 美丽塔Ⅰ

2865. 美丽塔 I 题目描述&#xff1a; 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&#xff0c;我们称这些塔是 美丽 的&#xff1a; 1 < height…

QT笔记 - QToolButton triggered(QAction *)不触发问题

QToolButton 有两个功能&#xff0c;一个是基本按钮功能&#xff0c;同QPushButton一样&#xff0c;发出clicked()信号。 另一个功能是QAction功能&#xff0c;发出触发triggered(QAction *)信号&#xff0c;但它自己不包含QAction&#xff0c;需要同其它比如QMenu或QToolBar上…

深度解析单片机:历史、发展与您关心的问题

什么是单片机&#xff1f; 定义&#xff1a;单片机是一种集成了中央处理器&#xff08;CPU&#xff09;、内存和外设功能的微型计算机系统。与传统计算机相比&#xff0c;单片机通常集成在一个芯片上&#xff0c;用于控制特定的应用。#单片机# 特点&#xff1a; 封装紧凑&…

人工智能:更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在这篇文章中&#xff0c;我们将了解更多的矩阵操作&#xff0c;同时再介绍几个人工智能 Python 库。 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…

再谈Android View绘制流程

一&#xff0c;先思考何时开始绘制 笔者在这里提醒读者&#xff0c;Android的View是UI的高级抽象&#xff0c;我们平时使用的XML文件也好&#xff0c;本质是设计模式中的一种策略模式&#xff0c;其View可以理解为一种底层UI显示的Request。各种VIew的排布&#xff0c;来自于开…

如何使用 dotnet pack 打包 .NET 跨平台程序集?

如何使用 dotnet pack 打包 .NET 跨平台程序集&#xff1f; dotnet pack 介绍官方描述 dotnet pack 命令说明使用示例打包 .net 类库项目生成带注释的 nuget 包构建特定平台的 nuget 包关于 .NET RID 目录 dotnet pack 介绍 dotnet pack 是一个 .NET Core NuGet 包打包程序。 …

OPenCv基础代码

import numpy as np import cv2 as cv import matplotlib.pyplot as plt#读取图像cv.imread()#读取图像cv.imshow()#绘制直线 cv.line(img,start,end,color,thickness)#绘制圆形 cv.circle(img,centerpoint, r, color, thickness)#绘制矩形 cv.rectangle(img,leftupper,rightdo…