当前位置: 首页 > 后端技术 > Python

leetcode87.打乱字符串打乱字符串

时间:2023-03-25 23:48:48 Python

https://leetcode-cn.com/probl...解题思路dpi[length]表示s1从下标i开始,s2从下标j开始,长度为length两个字符串是否可以通过置乱得到,如果可以,则值为True。例如:s1='abcde's2='deabc'dp0[3]为真。意思是s1的前三个字符经过打乱后可以成为s2的后三个字符。将所有长度初始化为1必须等于该字符。所以初始化:先将dp初始化为全False,然后将s1s2的每个字符两两比较,相等赋值为True。dp=[[Nonefor_inrange(l)]for_inrange(l)]foriinrange(l):forjinrange(l):dp[i][j]=[False]*(min(l-i,l-j)+1)foriinrange(l):forjinrange(l):dp[i][j][1]=s1[i]==s2[j]对状态转换equations两个字符串是否可以通过扰动相互转换,我们可以逐层看,最高层是整个字符串,最底层是字符。每层都可以将该字符串拆分为两个子字符串。每一层有两种情况:一种是当前层的两个子串已经交换过,另一种是当前层还没有交换过。对于这些情况中的每一种,检查每个子串划分的方法代码classSolution:defisScramble(self,s1:str,s2:str)->bool:l=len(s1)ifl!=len(s2):返回假dp=[[Nonefor_inrange(l)]for_inrange(l)]foriinrange(l):forjinrange(l):dp[i][j]=[False]*(min(l-i,l-j)+1)foriinrange(l):forjinrange(l):dp[i][j][1]=s1[i]==s2[j]forlengthinrange(2,l+1):foriinrange(l-length+1):forjinrange(l-length+1):forsepinrange(1,length):#检查每个A方法子串划分,sep为分割点ifdp[i][j][sep]anddp[i+sep][j+sep][length-sep]:#当前层的两个子串还没有交换过的caseofdp[i][j][length]=True如果dp[i][j+length-sep][sep]anddp[i+sep][j][length-sep]:#ofthecurrentlayer两个子串交换的情况dp[i][j][length]=Truebreakreturndp[0][0][l]欢迎来到我的博客:https://codeplot.top/我的博客分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/