1. 问题描述:

给你一个仅由数字组成的字符串 s 。请你判断能否将 s 拆分成两个或者多个非空子字符串 ,使子字符串的 数值按降序排列,且每两个相邻子字符串的数值之差等于 1 。例如,字符串 s = "0090089" 可以拆分成 ["0090", "089"] ,数值为 [90,89] 。这些数值满足按降序排列,且相邻值相差 1 ,这种拆分方法可行。另一个例子中,字符串 s = "001" 可以拆分成 ["0", "01"]、["00", "1"] 或 ["0", "0", "1"] 。然而,所有这些拆分方法都不可行,因为对应数值分别是 [0,1]、[0,1] 和 [0,0,1] ,都不满足按降序排列的要求。如果可以按要求拆分 s ,返回 true ;否则,返回 false 。子字符串 是字符串中的一个连续字符序列。

示例 1:

输入:s = "1234"
输出:false
解释:不存在拆分 s 的可行方法。

示例 2:

输入:s = "050043"
输出:true
解释:s 可以拆分为 ["05", "004", "3"] ,对应数值为 [5,4,3] 。
满足按降序排列,且相邻值相差 1 。

示例 3:

输入:s = "9080701"
输出:false
解释:不存在拆分 s 的可行方法。

示例 4:

输入:s = "10009998"
输出:true
解释:s 可以拆分为 ["100", "099", "98"] ,对应数值为 [100,99,98] 。
满足按降序排列,且相邻值相差 1 。

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/splitting-a-string-into-descending-consecutive-values

2. 思路分析:

分析题目可以知道我们需要将字符串s尝试从当前位置开始划分,尝试划分一位,两位,...n 位(n为字符串的长度)在划分字符串的时候我们需要保证当前划分的字符串对应的数字应该等于上一个划分的字符串对应的数值减1,因为一开始的时候我们不知道如何对字符串划分才能够最终得到递减的连续下降的序列,所以需要尝试所有字符串的划分方案才可以知道当前的字符串是否可以划分为递减的连续子序列,基于这个想法我们可以使用递归解决,因为字符串的长度在20之内所以使用递归还是可以通过的。在递归的方法中传递递归过程中所需的变量即可,其中需要传递当前递归的位置index,上一个数字last,用来记录递减的连续数字的个数count,字符串s,在往下递归之前判断当前划分的字符串对应的数字是否满足为上一个元素减1。

3. 代码如下:

import sysclass Solution:# index表示当前递归的位置, last用来记录上一个降序数字的值, 特别需要注意递归的时候下标的变化, count用来记录降序数字的个数def dfs(self, s: str, index: int, last: int, count: int):if index == len(s):if count > 1:# 只有当分解的数字的个数大于等于2的时候才满足题目要求return Truereturn False# 对于每一个开始位置都可以截取从当前位置开始长度为k的字符串所以需要在for循环中递归for i in range(index, len(s) + 1):n = int(s[index: i + 1])# 判断是否可以往下递归if last == sys.maxsize or n + 1 == last:if self.dfs(s, i + 1, n, count + 1): return Truereturn Falsedef splitString(self, s: str) -> bool:return self.dfs(s, 0, sys.maxsize, 0)

1849 将字符串拆分为递减的连续值(递归)相关推荐

  1. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)

    LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...

  2. 【leetcode】1849. 将字符串拆分为递减的连续值

    给你一个仅由数字组成的字符串 s . 请你判断能否将 s 拆分成两个或者多个 非空子字符串 ,使子字符串的 数值 按 降序 排列,且每两个 相邻子字符串 的数值之 差 等于 1 . 例如,字符串 s ...

  3. 每日一题(字符串拆分)

    前言:为了让小伙伴更方便的学习编程语言,小白每天都会分享一道编程题.小白也创建了一个微信公众号,会同步更新题目和相关的视觉领域的知识,如果小伙伴不方便在网页上阅读文章,可以关注微信公众号"小 ...

  4. 算法:一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度

    一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度. 如:uyuy 11 ikkhkhkhk kkj,结果:9 最暴力方案1(没分,只能用于验证其他方案结果正确性): public s ...

  5. Python实例:含有多种分割符字符串拆分方法的详细解析

    Python实例:含有多种分割符字符串拆分方法的详细解析 问题描述 一.理解几个重要的内置函数 1.1 split函数 1.2 extend函数 1.3 lambda匿名函数 1.4 map函数 二. ...

  6. 在Bash中将字符串拆分为数组

    本文翻译自:Split string into an array in Bash In a Bash script I would like to split a line into pieces a ...

  7. c将字符串拆分,并存入结构体

    c将字符串拆分,并存入结构体 函数功能 代码实现 结果显示 函数功能 字符串格式:type=0&u=user1&p=pass1 结构体格式: typedef struct{unsign ...

  8. UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理(c++实现)...

    一.字符编码简单介绍 1. ASCII码 在计算机内部,全部的信息终于都表示为一个二进制的字符串.每个二进制位(bit)有0和1两种状态,因此八个二进制位就能够组合出256种状态,这被称为一个字节(b ...

  9. boost::regex模块将字符串拆分为标记的测试程序

    boost::regex模块将字符串拆分为标记的测试程序 实现功能 C++实现代码 实现功能 boost::regex模块将字符串拆分为标记的测试程序 C++实现代码 #include <boo ...

最新文章

  1. 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度
  2. python md5_Python提取MD5
  3. sql语句(Oracle和sqlserver)
  4. how is configuration data loaded for framework preloadLibCss
  5. 香肠派对电脑版_《香肠派对》新春直播活动来袭
  6. Java 11将包含更多功能
  7. 二进制包如何知道go 版本_gops 是怎么和 Go 的运行时进行交互的?
  8. MySQL 基础 ———— 变量
  9. Dell Kace K1000测试报告
  10. 一个过滤器不仅解决了会话标识未更新同时还顺带解决了已解密的登录请求
  11. 专访Wunderlist主设计师Jan Martin:永远不要盲目跟风流行趋势
  12. 晕晕沉沉的一天,ISAPI_Rewrite 2.9破解版竟然是假的
  13. ISLR读书笔记十六:最大边际分类器(maximal margin classifier)
  14. [图论]最大流问题(Maximum flow)的定义
  15. java射击_java射击类游戏
  16. 服务器中了挖矿病毒的检测及删除方法
  17. CVE-2020-1938 幽灵猫( GhostCat ) Tomcat-Ajp协议 任意文件读取/JSP文件包含漏洞分析
  18. 阿里巴巴中文网站架构发展历程
  19. 程序员如何找女朋友?教你程序员找女朋友的技巧!
  20. PHP实现一次性多张图片上传功能

热门文章

  1. 单点登录-CAS介绍
  2. 云呐:固定资产清查盘点方案,固定资产清查范围是怎样的?
  3. python实现企业微信群机器人提醒功能
  4. 学习 ES 的笔记、全文检索、倒排索引、Lucene、ik中文分词器、Kibana使用Dev Tools
  5. Python爬虫之findall和lxml
  6. Spring事务切面原理
  7. 专利修改:ps换填充色
  8. 小程序中实现待办功能
  9. CodeForces 878 简要题解
  10. Monkey测试教程