leetcode 87 Scramble String(递归+剪枝)

2024-03-03 14:08

本文主要是介绍leetcode 87 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 representation of s1 = "great":

    great
   /       \
  gr    eat
 / \        /  \
g   r   e   at
              / \
            a   t
To scramble the string, we may choose any non-leaf node and swap its two children.

For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".

    rgeat
   /      \
  rg    eat
 / \       /  \
r   g   e   at
               / \
             a   t
We say that "rgeat" is a scrambled string of "great".

Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".

    rgtae
   /     \
  rg    tae
 / \      /  \
r   g   ta  e
         / \
        t   a
We say that "rgtae" is a scrambled string of "great".

Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

分析:
一个字符串有很多种二叉表示法,解决复杂问题的方法是从简单的特例来思考,从而找出规律。
先考察简单情况:
字符串长度为1:很明显,两个字符串必须完全相同才可以。
字符串长度为2:当s1="ab", s2只有"ab"或者"ba"才可以。
对于任意长度大于2的字符串,我们可以把字符串s1分为非空的 left1 和 right1 两个部分,s2分为非空的 left2 ,right2 两个部分,
满足((left1,left2) && (right1,right2))或者 ((left1,right2) && (right1,left2))
即:我们需要考虑下面几种情况:
1.如果两个substring相等的话,则为true
2.如果两个substring长度不等,则为false
3.如果两个substring排序后不相等,则为false
4.如果两个substring中间某一个点,左边的substrings为scramble string,同时右边的substrings也为scramble string,则为true
5.如果两个substring中间某一个点,s1左边的substring和s2右边的substring为scramblestring, 同时s1右边substring和s2左边的substring也为scramble string,则为true

容易想到的方法:递归+剪枝:
两个字符串的满足题意的必备条件是含有相同的字符集。
简单的做法是把两个字符串的字符排序后,然后比较是否相同,如不相同,直接返回False。通过这样的检查来剪枝,就可以大大的减少递归次数。

C++代码:

class Solution {
public:bool isScramble(string s1, string s2) {if(s1==s2)return true;if(s1.length()!=s2.length())return false;//剪枝,若满足题意,长度肯定相等string s11=s1;//生成s1和s2的副本,以便排序。(不要对s1和s2进行排序)string s22=s2;sort(s11.begin(),s11.end());sort(s22.begin(),s22.end());if(s11!=s22)return false;//剪枝,若满足题意,排序后,二者一定相等。for(int i=1;i<s1.length();i++){bool result=(isScramble(s1.substr(0,i),s2.substr(0,i))&&isScramble(s1.substr(i),s2.substr(i)))||(isScramble(s1.substr(0,i),s2.substr(s2.length()-i,i))&&isScramble(s1.substr(i),s2.substr(0,s2.length()-i)));if(result)return true;}return false;}
};

python代码:

class Solution(object):def isScramble(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if s1==s2:return Truel1=sorted(s1)#返回一个列表l2=sorted(s2)if l1!=l2:return Falsefor i in range(1,len(s1)):result=(self.isScramble(s1[:i],s2[0:i:1]) and self.isScramble(s1[i:],s2[i::1]))result=result or (self.isScramble(s1[:i],s2[len(s2)-i::1]) and self.isScramble(s1[i::1],s2[:len(s2)-i]))if result==True:return Truereturn False

友情链接:

关于Python切片,请参考: python切片操作

关于sorted函数的使用,请参考: python sorted()函数

这篇关于leetcode 87 Scramble String(递归+剪枝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/769843

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St