刷题第十六天-扰乱字符串

扰乱字符串

题目要求


解题思路

初步分析

给定两个字符串T和S,假设T是由S变换而来的

  • 如果T和S长度不一样,必定不能变来
  • 如果长度一样,顶层字符串S能够划分 S 1 S_1 S1 S 2 S_2 S2,同样字符串T也能够划分为 T 1 T_1 T1 T 2 T_2 T2
    • 情况一:没交换, S 1 S_1 S1> T 1 T_1 T1, S 2 S_2 S2> T 2 T_2 T2
    • 情况二:没交换, S 1 S_1 S1> T 2 T_2 T2, S 2 S_2 S2> T 1 T_1 T1
  • 子问题就是分别讨论两种情况, T 1 T_1 T1是否由 S 1 S_1 S1变来, T 2 T_2 T2是否由 S 2 S_2 S2变来,或 T 1 T_1 T1是否由 S 2 S_2 S2变来, T 2 T_2 T2是否由 S 1 S_1 S1变来.

得到状态

dp[i][j][k][h]表示T[k…h]是否由S[i…j]变来。由于变换必须长度是一样的,因此这边有个关系 i - j = h - k,可以把四维数组降成三维。dp[i][j][len]表示从字符串S中i开始长度为len的字符串是否能变换为从字符串T中j开始长度为len的字符串

转移方程

  • dp[i][j][k] =
    • OR1<=w<=k-1{dp[i][j][k] && dp[i+w][j+w][k-w] }
    • OR1<=w<=k-1 {dp[i][j+k-w][w] && dp[i+w][j][k-w]}
      解释一下:枚举 S1长度 w(从 1~k-1,因为要划分),f[i][j][w]表示S1能变成T1,f[i+w][j+w][k−w]表示S2能变成T2,或者是S1能变成T2,S2能变成T1。

初始条件

对于长度为1的子串,只有相等才能变过去,相等为true,不等为false

代码

lens1=len(s1)lens2 = len(s2)if lens1 != lens2:return False# 初始化dp3维数组dp[i][j][k]# i为0~lens1-1共lens1个, j为0~lens1-1共lens1个, k为1~lens1+1共lens1个dp=[ [ [False]*(lens1+1) for _ in range(lens1) ] for _ in range(lens1)]#初始化单个字符的情况for  i in range(lens1):for j in range(lens1):dp[i][j][1]= s1[i]==s2[j]#前面排除了s1和s2为单个字符的情况,那么我们就要划分区间了,k从2到lens1,也就是划分为s1[:k]和s1[k:]#枚举区间长度2~lens1for  k in range(2,lens1+1):#枚举S中的起点位置for i in range( lens1-k+1):#也就是在s1中枚举i的位置,因为后面会出现i+w的情况,而w最大就是k,# 就会有i+k的情况,所以i的取值范围就是0~lens1-k#枚举T中的起点位置for j in range(lens1-k+1):#枚举划分位置,s1[:k]中从for  w in range(1, k):#第一种情况:S1->T1,S2->T2if dp[i][j][w] and dp[i + w][j + w][k - w]:dp[i][j][k] = Trueprint("i,j,k", i, j, k)break#第二种情况:S1->T2,S2->T1#S1起点i,T2起点j + 前面那段长度k-w,S2起点i+前面长度kif dp[i][j + k - w][w] and dp[i + w][j][k - w]:dp[i][j][k] = Trueprint("i,j,k", i, j, k)breakreturn dp[0][0][lens1]

复杂度分析

时间复杂度: O ( N 3 ) O(N^3) O(N3)
空间复杂度: O ( N 4 ) O(N^4) O(N4)

其他解法

递归

这个题相当于让我们来判断两颗二叉树是否能通过翻转某些子树而相互得到。
思路:从一个位置将两个字符串分别划分为两个子串,然后递归判断两个字符串是否互相为[扰乱字符串]。
因为不知道在哪个位置分割字符串,所以直接遍历每个位置进行分割。在判断是否两个子串能否通过翻转变成相等的时候,需要保证传给函数的两个子串长度是相同的。
综上,因此分两个情况讨论:

  • S1[0:i]S2[0:i]作为左子树,S1[i:N]S2[i:N]作右子树
  • S1[0:i]S2[N-i:N]作为左子树,S1[i:N]S2[0:N-i]作为右子树

其中左子树的两个字符串的长度都是i,右子树的两个字符串的长度都是N-i。如果上面两种情况由一种能够成立,则s1s2是[扰乱字符串]
递归终止符号:当长度是0,长度是1时的两个字符串是否相等进行判断。如果两个字符串本身包含的字符就不等,那么一定不是[扰乱字符串],所以我们对两个字符串排序后,是否相等也进行判断。

记忆化递归
本题如果直接使用上面的递归方法解答,会超时,因为在不同的递归输入时,存在对相同子串的重复计算。避免重复计算的方式是使用[记忆化递归]。这个思路不难,就是把已经计算过的结果保存到缓存中,当此后再有同样的递归输入的时候,直接从缓存里面查,从而避免了重复计算。
在python中,有一个实现记忆化递归的神器,就是functool模块的lru_cache装饰器,它可以把函数的输入和输出结果缓存住,在后续调用中如果遇到了相同的输入,直接从缓存里面读取。顾名思义,它使用的是LRU(最近最少使用)的缓存淘汰策略。

@functools.lru_cache(maxsize=None, typed=False)

  • maxsize为最多缓存次数,如果为None,则无限制;
  • typed = True时,表示不同参数类型的调用将分别缓存。

这装饰器使用方法很简单,看下面代码的第二行。

代码

class Solution:@functools.lru_cache(None)def isScramble(self, s1: str, s2: str) -> bool:N = len(s1)if N == 0: return Trueif N == 1: return s1 == s2if sorted(s1) != sorted(s2):return Falsefor i in range(1, N):if self.isScramble(s1[:i], s2[:i]) and self.isScramble(s1[i:], s2[i:]):return Trueelif self.isScramble(s1[:i], s2[-i:]) and self.isScramble(s1[i:], s2[:-i]):return Truereturn False

复杂度分析
时间复杂度: O ( N ! ) O(N!) O(N!)
空间复杂度: O ( N ! ) O(N!) O(N!)

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

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

相关文章

RT-Thread 线程间通信 信号

信号 信号&#xff08;又称为软中断信号&#xff09;&#xff0c;在软件层次上是对中断机制的一种模拟&#xff0c;在原理上&#xff0c;一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。 信号的工作机制 信号在RT-Thread中用作异步通信&#xff0c;POSIX标准…

MES系统数据采集的几种方式

生产制造执行MES系统具有能够帮助企业实现生产数据收集与分析、生产计划管理、生产过程监控等的功能板块&#xff0c;在这里小编就不一一介绍了&#xff0c;主要讲讲它的数据采集功能板块&#xff0c;可以说&#xff0c;数据采集是该系统进行数据统计与生产管理等后续工作的基础…

SpringBoot默认配置文件

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…

【每日一题】2696. 删除子串后的字符串最小长度-2024.1.10

题目&#xff1a; 2696. 删除子串后的字符串最小长度 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操作中&#xff0c;你可以从 s 中删除 任一个 "AB" 或 "CD" 子字符串。 通过执行操作&#xff0c…

如何在数学建模竞赛中稳定拿奖

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Windows 10 Manager v3.9.0.0

软件介绍 Windows 10 Manager&#xff0c;Win10优化软件&#xff0c;香港Yamicsoft 公司开发的集微软Windows10的所有功能于一身的系统优化软件&#xff0c;包含40多个实用程序来优化&#xff0c;调整&#xff0c;清理&#xff0c;加速和修复Windows 10&#xff0c;可以让系统…

函数指针和回调函数

文章目录 一.函数指针1.什么是函数指针2.函数指针的形式3.函数指针的用途。1.调用函数2.作为参数进行传递 二.函数指针数组三.回调函数 一.函数指针 1.什么是函数指针 函数指针是指向函数的指针。在C语言和C中&#xff0c;函数指针可以用来存储函数的地址&#xff0c;并且可以…

【操作系统】优化MBR程序:让MBR调用显存吧

一.显存、显卡以及显示器的概述 显卡用于连接CPU和显示器&#xff0c;我们调用显示器时&#xff0c;其实就是利用显卡提供的IO接口间接地对显示器进行操作&#xff0c;所以显卡也称之为显示适配器。接下来我们将优化之前写的MBR程序&#xff08;参考&#xff1a;【操作系统】BI…

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

【LeetCode】2626. 数组归约运算

数组归约运算 题目题解 题目 给定一个整数数组 nums、一个 reducer 函数 fn 和一个初始值 init&#xff0c;返回通过依次对数组的每个元素执行 fn 函数得到的最终结果。 通过以下操作实现这个结果&#xff1a;val fn(init, nums[0])&#xff0c;val fn(val, nums[1])&#…

AlexNet论文翻译与精读

1:该论文解决了什么问题&#xff1f; 图像分类问题 2&#xff1a;该论文的创新点&#xff1f; 1:使用了大的深的卷积神经网络进行图像分类&#xff1b; 2:采用了两块GPU进行分布式训练&#xff1b; 3:采用了Relu进行训练加速&#xff1b; 4:采用局部归一化提高模型泛化能…

Qt 窗口阴影边框

环境&#xff1a;Qt 5.15 VS2019 方法一&#xff1a;QGraphicsDropShadowEffect 实现方法参考链接&#xff1a;https://blog.csdn.net/goforwardtostep/article/details/99549750 使用此方法添加窗口阴影&#xff0c;会出现警告信息&#xff1a; 且窗口最大化与还原切换时会…

多态、抽象类和接口(深拷贝和浅拷贝)

目录​​​​​​​ 前言&#xff1a; 多态&#xff1a; 多态的定义&#xff1a; 向上转型&#xff1a; 方法重写&#xff1a; 再看toString方法&#xff1a; 动态绑定&#xff1a; 向下转型&#xff1a; 小练习&#xff1a; 抽象类&#xff1a; 什么是抽象类&am…

Logstash应用-同步ES(elasticsearch)到HDFS

1.场景分析 现有需求需要将elasticsearch的备份至hdfs存储&#xff0c;根据以上需求&#xff0c;使用logstash按照天级别进行数据的同步 2.重难点 数据采集存在时间漂移问题&#xff0c;数据保存时使用的是采集时间而不是数据生成时间采用webhdfs无法对文件大小进行设置解决…

水产冷链物流行业零下25℃库架一体 海格里斯HEGERLS四向穿梭式冷藏冷库智能密集仓

随着国内外仓储物流整体规模和低温产品消费需求的稳步增长&#xff0c;冷链市场应用潜力不断释放。在传统“货架叉车”的方式下&#xff0c;货物、人员及机械设备不断进出&#xff0c;容易造成温度波动&#xff0c;导致冷量流失。立体冷库则以更高密度、更具成本效益的方式&…

性能测试中TPS上不去的几种原因浅析

昨晚在某个测试群看到有人问了一个问题&#xff1a;压力测试中TPS一直上不去&#xff0c;是什么原因&#xff1f;稍微整理了下思路&#xff0c;列举性的简略回答了他的问题。 这篇博客&#xff0c;就具体说说在实际压力测试中&#xff0c;为什么有时候TPS上不去的原因。如有遗…

C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c函数指针。在一些源码中经常能看到c函数指针&#xff0c;但之前一直觉着这一块比较复杂&#xff0c;就一直没去仔细研究&#xff0c;终于有时间去仔细研究这一块内容了。 c风格的函数指针 函数指针是指将一个函数赋值给一个变量的方法&#xff0c;可以将函数作为一个参…

Vercel配置自定义域名

首先你需要有一个域名 1.点击部署的项目设置 2.找到Domains 3.输入自己的域名 点击添加之后按要求去域名服务商添加解析即可 4.显示下面内容就设置完成了&#xff0c;

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

强化学习求解TSP(三):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…