LeetCode 87.扰乱字符串

这篇博客讨论了LeetCode第87题——扰乱字符串的解决方案,通过动态规划方法来判断一个字符串是否能通过特定变换成为目标字符串。文章详细阐述了如何确定状态、建立子问题,并给出了转移方程和初始条件,帮助读者理解算法思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode 87.扰乱字符串

给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。

注意题目描述: 不一定是从中间等分。

动态规划

确定状态:
设两个字符串分别为TS题目求判断一个字符串T是否可以由S经过题意中的变换而成
因此,首要前提是TS的长度相等。
按照题意,S会被分解为S=S1+S2,同理,T=T1+T2若满足S可变换为T则会有以下两种情况:
情况一: S1对应T1S2对应T2
情况二: S1对应T2S2对应T1
在这里插入图片描述
那么只需要判断是否满足二者之一即可,引出了子问题:

  • S1是否对应T1,S2是否对应T2
  • S1是否对应T2,S2是否对应T1

状态:
f[i][j][k][h]表示S[i...j]是否对应T[k...h]
由于ST的子串长度相同,可以只记录起始位置,可优化为:f[i][j][k]k为子串的长度
例如:
S,T存在这样的一个划分,SiTjS,T的子串,Si从下标i=7开始,Tj从下标j=0开始,长度为5f[7][0][5]可表示Si(i=7)对应Tj(j=0)

转移方程:
枚举所有子串情况一与情况二取OR。
f[i][j][k]表示Si是否对应Tj,枚举SiTj小于k的子串,若他们的子串存在两种情况之一,SiTi即成立。
在这里插入图片描述

初始条件和边界:
对于长度为1的子串:若S[i]=T[j]f[i][j][1]=true,否则为false
计算顺序k从小到大计算
答案为f[0][0][N]

class Solution {
   
    public boolean isScramble(String s1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值