leetcode 87. Scramble String(扰乱字符串)

豆包 LeetCode 87. Scramble String public boolean isScramble(String s1, String s2) 核心思路:通过递归枚举所有分割可能,结合记忆化避免重复计算,用字符排序剪枝快速排除不可能的情况;关键判断:扰乱字符串的两种核心情况(交换/不交换子串)必须全部验证,只要其一满足即可判定为 true;优化点:字符排序剪枝是提升性能的关键,能提前终止无效的递归路径。 阅读详情

在这里插入图片描述

scramble(字符串s) 算法:
s长度为1时结束。
s可以拆分成2部分x和y,s=x+y,
这两部分可以交换,也可以不交换,即 s = x+y 或 s = y+x.
上面scramble还会递归作用于x 和 y.

给出相同长度的字符串s1, s2, 问s2是否可通过scramble(s1)获得。

思路:

假设s1和s2的长度是n.

在scramble算法中,第1,字符串可以拆分成两部分,
那么可以拆分的点可以在任意下标处,
所以需要遍历s1的所有下标。
假设遍历下标为 i 时,s 拆分成 0 ~ i 和 i+1 ~ n-1两段。所以 i : 0 ~ n-2 (不是n-1 !)

第2,拆分的两部分 可交换可不交换。
假设在 i 处把s1分成两部分: s1[0 ~ i] 和 s1[i+1 ~ n-1] ,
如果不交换,需要进一步scramble s1[0 ~ i] 和 s2[0 ~ i], s1[i+1 ~ n-1] 和 s2[i+1 ~ n-1].
如果交换,需要进一步scramble s1[0 ~ i] 和 s2[i ~ n-1], s1[i+1 ~ n-1] 和 s2[0 ~ i-1].

同时,我们观察到,
s1能scramble成s2的前提是 它们的字母必须是一样的(不管顺序)。
因为scramble只负责拆分和交换,并不会改变字母,
如果字母不一样,则s1 scamble不成s2的.

所以可以用一个长度为26的数组统计每个字母出现的次数,
因为涉及到交换和不交换,
所以分别用一个cnt统计s1[0 ~ i]的字母,
cntF统计s2[0 ~ i]的字母,cntB统计s2[i+1 ~ n-1]的字母。
字母个数相同时,再进行scamble算法。

两个字符串相等时结束。
已经判断过的,用一个map保存起来,再遇到同样的s1和s2, 直接取结果。

注意s必须是拆分成2部分,因此 i < n-1, 而不是 i < n,如果 i = n-1, 会相当于只拆分成一部分(即s1本身,会陷入无限循环)。

class Solution {
    HashMap<String, Boolean> map = new HashMap<>();
    
    public boolean isScramble(String s1, String s2) {
        String s = s1 + s2;
        //相当于DP,记录已经判断过的s1和s2
        if(!map.containsKey(s)) map.put(s, helper(s1, s2));
        return map.get(s);    
    }

    boolean helper(String s1, String s2) {
        if(s1.equals(s2)) return true;

        int[] cnt = new int[26];  //s1从前往后字母计数
        int[] cntF = new int[26]; //s2从前往后字母计数,cntForward
        int[] cntB = new int[26]; //s2从后往前字母计数,cntBackward

        for(int i = 0; i < s1.length()-1; i++) {  //遍历所有的分割点
            int j = s2.length()-1-i;
            cnt[s1.charAt(i)-'a']++;   //统计s1的0~i段字母个数
            cntF[s2.charAt(i)-'a']++;  //统计s2的0~i段(前半段)字母个数
            cntB[s2.charAt(j)-'a']++;  //统计s2的i~n-1段(后半段)字母个数

            if(Arrays.equals(cnt, cntF)) {  //s2的0~i段与s1的0~i段是否字母个数一致(相当于不swap)
                if(isScramble(s1.substring(0,i+1), s2.substring(0,i+1)) &&
                isScramble(s1.substring(i+1), s2.substring(i+1))) return true;
            }
            //不要用else if!不然会漏掉交换后的验证
            if(Arrays.equals(cnt, cntB)){  //s2的i~n-1段与s1的0~i段是否字母个数一致(相当于swap)
                if(isScramble(s1.substring(0,i+1), s2.substring(j)) && 
                isScramble(s1.substring(i+1), s2.substring(0,j))) return true;
            }
        }
        return false;
    }
}
【Unity】Pico VR 开发实战:从环境搭建到交互实现 本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。 阅读详情

相关推荐

手把手教你用UC3842搭建12V/5A反激电源(附PSIM仿真文件)

本文详细介绍了基于UC3842的12V/5A反激电源设计与PSIM仿真实践。从UC3842芯片选型、高频变压器计算到PSIM仿真模型搭建,提供完整的开关电源设计流程。特别包含PCB布局要点和实测优化建议,帮助工程师快速掌握反激电源开发技巧。

u6v7w8x的博客 1203

LeetCode——87. 扰乱字符串(Scramble String)[困难]——分析及代码(Java)

LeetCode——87. 扰乱字符串[Scramble String][困难]——分析及代码[Java]一、题目二、分析及代码1. 动态规划(1)思路(2)代码(3)结果三、其他 一、题目 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行下述步骤: - 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。 - 随机 决定是要「

江南土豆的博客 428

ATE测试基础——直流参数测试

芯片测试在发展过程中诞生了许多术语,初次接触的人大部分都会被绕晕。因此为方便广大读者理解,在开始介绍测试项之前,需要对测试领域的名词进行解释。还有部分较为抽象的内容,需要略作展开。DUT——Device Under Test,正在被测试的器件Pin——器件引脚,信号引脚分为输入,输出,三态和双向四类,负责与外界进行信息交互;电源引脚分为电源和地两类,结构与信号引脚不同,负责给器件内部运行和外部输出提供电平。输入:在外部信号和器件内部逻辑之间起缓冲作用的信号输入通道;

你骄傲地飞远的博客 1万+

Scramble String -- leetcode

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = "great": great / \ gr

elton_xiao的专栏 718

科研绘图系列:R语言绘制宏基因组分析的可视化图形(network & barplot & heatmap)

科研绘图系列:R语言多图形组合(network & barplot & heatmap)

专注生信领域 644

04-协议基础03:USB 2.0信号与电气特性

USB 2.0使用两根差分信号线D+/D-进行数据传输,支持低速(1.5Mbps)、全速(12Mbps)和高速(480Mbps)三种速率。USB总线为主从模式,所有事务由Host发起。端电阻值作用HostRpd(D+)15KΩ±5%下拉,默认低电平HostRpd(D-)15KΩ±5%下拉,默认低电平全速设备Rpu(D+)1.5KΩ±5%上拉到3.3V,标识全速低速设备Rpu(D-)1.5KΩ±5%上拉到3.3V,标识低速USB 2.0硬件要点。

内核笔记 104

【字符串】scramble string

相当于按这种二分(也不算找中心分啦)的结构,结构之间可以互换顺序,结构之内(由于又可以二分)也可以互换顺序。问你两个字符串互不互为这种关系。 大致思路: 刚开始没反应过来——其实这也是求“字符串的全排列”是否对应——>看各字母出现的次数。 只不过,这涉及到二叉树的结构,很明显又让人知道要——递归。 所以,就是遍历i来分割出不同的二叉树结构,然后递归地来看两个子树是不是满足全排...

It's the Climb 478

游戏引擎定制化:大厂如何玩转性能极限(大白话生动有趣版)

游戏大厂如何深度定制游戏引擎?本文系统解析了商业引擎的局限性及大厂定制化的核心诉求。主要内容包括: 大厂定制引擎的根本原因:性能瓶颈、差异化需求、自有生态整合等 主流引擎的优劣势对比及适用场景 定制化重点领域:渲染管线优化、物理系统重构、网络架构改造等 全流程定制方案:从需求分析到模块重构再到工具链开发 典型案例:如腾讯CF手游的渲染优化、原神的热更新系统等 文章指出,顶级游戏产品必须对引擎核心模块动刀,通过深度定制实现性能突破和创新功能开发。同时提供了风险规避建议和技术演进趋势,为游戏开发者提供了宝贵的实

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 635

87. 扰乱字符串(Scramble String) LeetCode C++版本

题目:难度Hard(请自行点击链接查看) https://leetcode-cn.com/problems/scramble-string/ V2版本的执行时间已经能达到较为理想的结果了。后面只是为了追求更高执行效率。 一、分析: 由题意:这个“乱序”字符串,是由原字符串任意二叉树分割(每一支至少要有一个字符)成每个叶子只有一个字符,再选择任意多个子节点交换左右子树得到。 这操作很明显属于...

玮智能的博客 602

AttributeError: module ‘numpy‘ has no attribute ‘int‘解决方案

本文主要介绍了AttributeError: module ‘numpy’ has no attribute 'int’解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 方案一 2.2 方案二

weixin_43178406的博客 28万+

Python FastAPI 面试题及参考答案

FastAPI 的路由机制是其核心功能之一,用于将不同的 URL 路径映射到相应的处理函数。通过定义路由,可以构建出功能丰富的 API。在 FastAPI 中,使用装饰器来定义路由。在这个示例中,是一个装饰器,它将根路径"/"的 GET 请求映射到read_root函数。当客户端发送一个 GET 请求到根路径时,FastAPI 会调用read_root函数并返回结果。

大模型大数据攻城狮的专栏 2248

【业务领域】Scramble/de-Scramble加扰解扰总结

加扰/解扰的基本概念,为什么要有加扰解扰,加扰解扰实现方法等;

飓风_数字IC验证的博客 1万+

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1068

LeetCode 87. Scramble String(字符串扰乱)

原题网址:https://leetcode.com/problems/scramble-string/ Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible

James Pan 1809

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【LeetCode】 87. Scramble String 扰乱字符串(Hard)(JAVA)

【LeetCode】 87. Scramble String 扰乱字符串(Hard)(JAVA) 题目地址: https://leetcode.com/problems/scramble-string/ 题目描述: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty ...

qq_16927853的博客 197

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[Swift]LeetCode87. 扰乱字符串 | Scramble String

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/streng...

weixin_30419799的博客 126

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【LeetCode】#87扰乱字符串(Scramble String)

【LeetCode】#87扰乱字符串(Scramble String) 题目描述 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。 下图是字符串 s1 = “great” 的一种可能的表示形式。 great / gr eat / \ / g r e at / a t 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点...

weixin_43858604的博客 182

[LeetCode]87. Scramble String

[LeetCode]87. Scramble String题目描述思路对于题目中描述的扰乱字符串,可能存在多个递归解决 当前输入的两个字符串如果相等,即返回true 否则 对i从1到len-1 判断 s1(0,i) 与 s2(0,i)或则s2(len - i, len - 1)是否满足扰乱串的条件 s1(i,len - 1) 与 s2(i, len - 1)或则s2(0, l

Lcharon的博客 748

判断两个字符串是否为扰乱字符串

的位置,切完第一刀后,分成的两个字符串可以旋转也可以不旋转,枚举出所有情况后,如果。方法就是判断两个字符串的长度和字符种类个数是否一致,因为比较简单,不做赘述。这个方法在Leetcode上会超时,接下来,我们需要把这个方法改成动态规划。如果两个字符串的字符种类和数量不太一样,那么肯定不互为扰乱字符串。如果不等于0,说明计算的结果已经算过了,则直接可以拿结果即可。以上两个情况,只要一个满足,就说这两个是互为扰动串。个长度字符,是否互为扰乱字符串。第一刀切的位置,本例中,互为扰动字符串,那么。

Practitioner 245

87. Scramble String(扰乱字符串)

题目链接:https://leetcode.com/problems/scramble-string/ 思路: 其实最初拿到这道题是没有思路的,看了大佬们的解释才明白, 递归实现,字符串S1和S2 (1)S1[0,i) 与S2 [ 0,i) &amp;&amp; S1 [i,len)与S2 [i,len) 或者 (2)S1 [0,i) 与S2 [len-i,len) ...

God_Mood的博客 391

LeetCode:87. Scramble String - Python

87. 扰乱字符串 问题描述: 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。 下图是字符串s1 = &quot;great&quot;的一种可能的表示形式。 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。 例如,如果我们挑选非叶节点&quot;gr&quot;,交换它的两个子节点,将会产生扰乱字符串&quot;rgeat&quot;。 我们将&quot;rgeat”称作&a

Growth Diary 751

87. 扰乱字符串

使用下面描述的算法可以扰乱字符串s得到字符串t如果字符串的长度为1,算法停止如果字符串的长度>1,执行下述步骤在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串s,则可以将其分成两个子字符串x和y,且满足s=x+y。随机决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s可能是s=x+y或者s=y+x。https。...

xiaolu567的博客 597

【LeetCode】87. Scramble String 解题报告(Python)

题目分析: 这个题目比较难理解,说是给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。下图是字符串 s1 = “great” 的一种可能的表示形式。 在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。 我们将 "rgeat” 称作 ...

L141210113的专栏 411

力扣 87. 扰乱字符串 记忆化搜索 思维

https://leetcode-cn.com/problems/scramble-string/ 思路:先定义一种字符串之间的相似运算:如果字符串a、b长度相等且含有的字符都相同,我们认为a和b相似。显然如果s、t互为扰乱字符串,则它们一定相似。从扰乱字符串的规则可以发现,如果断点是i,那么至少满足以下两种情况的某一种: s[0…i]、t[0…i]s[0…i]、t[0…i]s[0…i]、t[0…i]相似且s[i+1…n)、t[i+1…n)s[i+1…n)、t[i+1…n)s[i+1…n)、t[i+1…

xiji333的博客 232

LeetCode-87 Scramble String

Description We can scramble a string s to get a string t using the following algorithm: If the length of the string is 1, stop. If the length of the string is > 1, do the following: • Split the string into two non-empty substrings at a random index, i.

秦智慧的博客 163

[Leetcode][python]Scramble String/扰乱字符串

题目大意 https://leetcode-cn.com/problems/scramble-string/description/ 给出两个等长的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。 解题思路 递归 字符串长度为1:很明显,两个字符串必须完全相同才可以。 字符串长度为2:当s1=”ab”, s2只有”ab”或者”ba”才可以。 对于任意长度的字符串,...

蛮三刀酱 1429
上一篇: leetcode 1402. Reducing Dishes(减少菜肴)
下一篇: leetcode 1444. Number of Ways of Cutting a Pizza(切披萨的方法数)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值