87. 扰乱字符串

news2024/9/21 2:40:02

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

解题思路:

对于给定的两个字符串S和T。

如果S和T的长度不相等,T肯定不是S的扰乱字符串。

如果S和T的长度相等,则可以在某一个随机下标处进行分割,会将两个字符串S分割成两部分,同理,T也可以用两部分表示,如下如所示:

字符串S被分割为S1和S2,字符串T被分割为T1和T2,此时可以分为两种情况:

  1. 情况一:S1和S2没有交换,此时需要判断T1是否是S1的扰乱字符串,T2是否是S2的扰乱字符串。
  2. 情况二:S1和S2交换了,此时需要判断T2是否是S1的扰乱字符串,T1是否是S1的扰乱字符串。

显然上述分割会将大问题分割成两个小问题:

  1. T1是否是S1的扰乱字符串,T2是否是S2的扰乱字符串
  2. T2是否是S1的扰乱字符串,T1是否是S2的扰乱字符串

子问题的解题问题和大问题的解题步骤类似,显然可以使用动态规划来求解。

  1. 定义状态:dp[i][j][m][n],表示T[m,...,n]是否是S[i,... ,j]的扰乱字符串,因为如果是然乱字符串,那个相同部分的长度一定相等,即 n - m = j - i = len,所以可以将四维数组优化为三维数组,d[i][j][len],表示字符串T中从j开始的len个字符串是否是从字符串S中 i 开始的len个字符串的扰乱字符串
  2. 状态转移方程:
    1. 假设随机划分处使得S1的长度为k,如下图所示:​​​​​​​
    2. 对于情况一,不交换S1和S2:此时需要判断T1是否是S1的扰乱字符串,T2是否是S2的扰乱字符串,所以dp[i][j][len] = dp[i][j][k] && dp[i+k][j+k][len-k]
    3. 对于情况二,交换S1和S2:此时需要判断T2是否是S1的扰乱字符串,T1是否是S1的扰乱字符串,注意:需要令T2和S1的长度相等,T1和S2的长度相等,所以,dp[i][j][len] = dp[i][j+len-k][len] && dp[i+k][j][len-k]
    4. 上述只是判断了一处分割位置的状态转移方程,我们需要枚举出所有的分割位置,所以最终的状态转移方程为:dp[i][j][len] = ( dp[i][j][k] && dp[i+k][j+k][len-k] ) || ( dp[i][j+len-k][len] && dp[i+k][j][len-k] ),其中对于每一个len,k都需要从1枚举到 len-1,只要有一个枚举位置可以令 dp[i][j][len] 等于true即可,此时就可以结束枚举了。
  3. 初始状态:两个长度为1的字符串,显然如果这两个字符相等,则 dp[i][j][1] = true,否则false

AC代码:

class Solution {
    public static boolean isScramble(String s, String t) {
        int n = s.length();
        int m = t.length();
        if (n != m) {
            return false;
        }

        boolean[][][] dp = new boolean[n][n][n + 1];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                dp[i][j][1] = s.charAt(i) == t.charAt(j);
            }
        }

        for (int len = 2; len <= n; len++) {
            //枚举s中的位置
            for (int i = 0; i <= n - len; i++) {
                //枚举t中的位置
                for (int j = 0; j <= n - len; j++) {
                    //枚举分割的位置
                    for (int k = 1; k <= len-1; k++) {
                        //不交换S1和S2
                        if(dp[i][j][k]&&dp[i+k][j+k][len-k]){
                            dp[i][j][len]=true;
                            break;
                        }
                        //交换S1和S2
                        if (dp[i][j+len-k][k]&&dp[i+k][j][len-k]){
                            dp[i][j][len]=true;
                            break;
                        }
                    }
                }
            }
        }
        return dp[0][0][n];
    }
}

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

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

相关文章

空时自适应处理用于机载雷达——波束空间空时自适应处理(Matla代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[CFI-CTF 2018]powerPacked 题解

脱掉upx壳 逻辑很简单 str"EHK}kanqxgarqygtre" flag"" for i in str:flagchr(ord(i)-2) print(flag) CFI{i_love_powerpc}

ThreadLocal概述

一、概述 ThreadLocal被称为线程局部变量&#xff0c;用于在线程中保存数据。由于在ThreadLocal中保存的数据仅属于当前线程&#xff0c;所以该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。 ThreadLocal用于在同一个线程间&#xff0c;在不同的…

Prompt GPT推荐社区

大家好&#xff0c;我是荷逸&#xff0c;这次给大家带来的是我日常学习Prompt社区推荐 Snack Prompt 访问地址&#xff1a;http://snackprompt.com Snack Prompt是一个采用的Prompts诱导填空式的社区&#xff0c;它提供了一种简单的prompt修改方式&#xff0c;你只需要输入关…

​Spring Cloud Alibaba与Nacos版本对应关系​

下面是Spring Cloud Alibaba与Nacos版本对应关系 Spring Cloud Alibaba VersionNacos Version2021.0.1.0*1.4.22.2.7.RELEASE2.0.32.2.6.RELEASE1.4.22021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE1.4.12.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE1.3.32.…

curl请求https|http网站时出现Binary output can mess up your terminal

请求网站时出现​ 那么这里有几种情况 文件本身为二进制文件内容压缩 如果是第一种情况&#xff0c;那么直接保存你要下载的二进制文件&#xff0c;使用 curl https://a.com -o 文件名保存在一个文件中 或者使用 -o -直接输出在终端 curl https://a.com -o -如果你本来访问…

Nacos源码构建报错程序包不存在com.alibaba.nacos.consistency.entity

直接启动 Nacos.java 报错。 Nacos源码构建报错程序包不存在com.alibaba.nacos.consistency.entity 解决方案 执行 mvn compile。 原因 com.alibaba.nacos.consistency.entity包目录是由protobuf在编译时自动生成。可通过mvn compile来自动生成他们。如果使用的是IDEA&…

问道管理:A股连续两日放量上扬,分析称筹码充分交换后或趋势性上涨

利好加持下前一买卖日高开低走后&#xff0c;A股迎来全线暴升&#xff01; 8月29日&#xff0c;三大指数均涨超1%&#xff0c;其间深证成指和创业板指更是涨逾2%&#xff0c;分别上行2.17%、2.82%。值得一提的是&#xff0c;商场上行中科创板股票全线迸发&#xff0c;科创50指…

供水管网安全运行监测,持续保障市民用水安全需求

供水管网是城市供水系统的核心组成部分&#xff0c;安全运行对人民的生活和社会发展至关重要。要持续不断地向城市供应数量充足、质量合格的水&#xff0c;应解决管道爆管问题、管网漏损导致严重的资源浪费等&#xff0c;及时发现管网故障&#xff0c;提高维护效率、降低损失&a…

【数据结构】初识树

目录 一&#xff0c;树的基本概念 1.1树的相关概念 1.2树的表示 二&#xff0c;二叉树的基本概念 2.1特殊的二叉树&#xff1a; 2.2二叉树的性质 2.3二叉树的存储结构 1. 顺序存储 2.链式存储 一&#xff0c;树的基本概念 树是一类重要的非线性数据结…

芯探科技--泛自动驾驶激光雷达解决方案

泛自动驾驶应用领域: 无人配送车 无人叉车 服务机器人 无人清扫车 …… 泛自动驾驶激光雷达解决方案介绍 在中低速移动过程中,类似无人配送车、无人叉车、服务型机器人、无人清扫车等具有自动驾驶功能的车辆,其需要对周围的环境进行探测,进而实现…

大数据Flink简介与架构剖析并搭建基础运行环境

文章目录 前言Flink 简介Flink 集群剖析Flink应用场景Flink基础运行环境搭建Docker安装docker-compose文件编写创建并运行容器访问Flink web界面 前言 前面我们分别介绍了大数据计算框架Hadoop与Spark,虽然他们有的有着良好的分布式文件系统和分布式计算引擎&#xff0c;有的有…

算法:分治思想处理快排递归以及快速选择/最小K个数问题

文章目录 算法原理实现思路典型例题颜色分类快速排序优化数组中最大的K个数最小的K个数 总结 算法原理 分治的原理就是分而治之&#xff0c;从原理上讲&#xff0c;就是把一个复杂的问题划分成子问题&#xff0c;再将子问题继续划分&#xff0c;直到可以解决 实现思路 基于分…

nvm 安装nodejs

1. 下载nvm 地址&#xff1a;Releases coreybutler/nvm-windows GitHub 2. 按要求一步步进行 3. 安装完成后配置nvm 的环境变量 找到nvm文件的路径&#xff0c;选中path&#xff0c;点击编辑讲nvm的路径放进去确定保存即可

RK3562 到底性能如何?安兔兔实测

RK3562采用四核A53Mali G52架构&#xff0c;主频2GHz&#xff0c;内置1T NPU算力以及13M ISP&#xff0c;拥有丰富的外围接口。其次在解码方面&#xff0c;支持H.264 1080P60fps、H.265 4K30fps&#xff1b;编码方面支持H.264 1080P60fps&#xff0c;此外还有高质量JPEG编解码。…

无涯教程-Android Intent Standard Actions函数

下表列出了各种重要的Android Intent标准操作。您可以查看Android官方文档以获取完整的操作列表- Sr.NoActivity Action Intent & Description1 ACTION_ALL_APPS 列出设备上所有可用的应用程序。 2 ACTION_ANSWER 处理来电。 3 ACTION_ATTACH_DATA 用于表示应将某些数据…

Python股票交易---均值回归

免责声明&#xff1a;本文提供的信息仅用于教育目的&#xff0c;不应被视为专业投资建议。在做出投资决策时进行自己的研究并谨慎行事非常重要。投资涉及风险&#xff0c;您做出的任何投资决定完全由您自己负责。 在本文中&#xff0c;您将了解什么是均值回归交易算法&#xff…

你的香港公司开始年审了吗?

小青是个SOHO&#xff0c;在19年找A注册的香港公司&#xff0c;一开始是想着有个自己的公司收款或者给客户做合同的时候不需要麻烦供应商&#xff0c;会相对方便一些。公司下来之后&#xff0c;每年年审的费用也就上千块&#xff0c;还不算太高。 一开始做年审&#xff0c;都是…

Rn实现省市区三级联动

省市区三级联动选择是个很频繁的需求&#xff0c;但是查看了市面上很多插件不是太老不维护就是不满足需求&#xff0c;就试着实现一个 这个功能无任何依赖插件 功能略简单&#xff0c;但能实现需求 核心代码也尽力控制在了60行左右 pca-code.json树型数据来源 Administrative-d…

基于RabbitMQ的模拟消息队列之三——硬盘数据管理

文章目录 一、数据库管理1.设计数据库2.添加sqlite依赖3.配置application.properties文件4.创建接口MetaMapper5.创建MetaMapper.xml文件6.数据库操作7.封装数据库操作 二、文件管理1.消息持久化2.消息文件格式3.序列化/反序列化4.创建文件管理类MessageFileManager5.垃圾回收 …