前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >LeetCode 1849. 将字符串拆分为递减的连续值(回溯)

LeetCode 1849. 将字符串拆分为递减的连续值(回溯)

作者头像
Michael阿明
发布于 2021-09-06 03:01:00
发布于 2021-09-06 03:01:00
97600
代码可运行
举报
运行总次数:0
代码可运行

文章目录

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 。

子字符串 是字符串中的一个连续字符序列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 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. 解题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    bool can = false;
public:
    bool splitString(string s) {
        dfs(s, LONG_LONG_MAX, 0);
        return can;
    }
    void dfs(string s, long long prevVal, int ct)
    {
        if(can) return; // 找到解了
        if(s == ""){
            if(ct > 1) // 个数至少为 2
                can = true;
            return;
        }
        long long curVal = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(curVal >= LONG_LONG_MAX/10)
                break; // 当前数字超过范围,肯定不存在解
            // LLMAX : 9223372036854775807, 19位
            curVal = curVal*10 + s[i]-'0';
            if(prevVal - curVal < 1)
                break; // curval 越来越大,不存在降序的
            else if(prevVal == LONG_LONG_MAX || prevVal - curVal == 1)
            {
                dfs(s.substr(i+1), curVal, ct+1);
            }
        }
    }
};

0 ms 5.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1903. 字符串中的最大奇数
给你一个字符串 num ,表示一个大整数。 请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 “” 。
Michael阿明
2021/09/06
5460
LeetCode 1869. 哪种连续子字符串更长
给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
Michael阿明
2021/09/06
2070
LeetCode 1933. 判断字符串是否可分解为值均等的子串
举例,"1111" 和 "33" 就是等值字符串。 相比之下,"123"就不是等值字符串。
Michael阿明
2021/09/06
5330
LeetCode 第 207 场周赛(245/4115,前5.95%)
全国排名: 245 / 4115,5.95%;全球排名: 774 / 12923,5.99%
Michael阿明
2021/02/19
3820
LeetCode 6056. 字符串中最大的 3 位相同数字
给你一个字符串 num ,表示一个大整数。如果一个整数满足下述所有条件,则认为该整数是一个 优质整数 :
Michael阿明
2022/05/10
2360
LeetCode 1763. 最长的美好子字符串
当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。 比方说,"abABB" 是美好字符串,因为 ‘A’ 和 ‘a’ 同时出现了,且 ‘B’ 和 ‘b’ 也同时出现了。 然而,"abA" 不是美好字符串因为 ‘b’ 出现了,而 ‘B’ 没有出现。
Michael阿明
2021/09/07
6780
LeetCode 1520. 最多的不重叠子字符串(贪心)
给你一个只包含小写字母的字符串 s ,你需要找到 s 中最多数目的非空子字符串,满足如下条件:
Michael阿明
2021/02/19
6310
☆打卡算法☆LeetCode 87、扰乱字符串 算法解析
链接:87. 扰乱字符串 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
2360
☆打卡算法☆LeetCode 87、扰乱字符串  算法解析
LeetCode 1957. 删除字符使字符串变好
我的CSDN博客地址 https://michael.blog.csdn.net/
Michael阿明
2021/09/06
6400
LeetCode 1864. 构成交替字符串需要的最小交换次数
给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。 请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。
Michael阿明
2021/09/06
3560
图解LeetCode——1422. 分割字符串的最大得分(难度:简单)
给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分。
爪哇缪斯
2023/05/10
1800
图解LeetCode——1422. 分割字符串的最大得分(难度:简单)
LeetCode 1839. 所有元音按顺序排布的最长子字符串(滑动窗口)
比方说,字符串 "aeiou" 和 "aaaaaaeiiiioou" 都是 美丽的 ,但是 "uaeio" ,"aeoiu" 和 "aaaeeeooo" 不是美丽的 。
Michael阿明
2021/09/06
4910
LeetCode 1799. N 次操作后的最大分数和(回溯 / 状态压缩DP)
给你 nums ,它是一个大小为 2 * n 的正整数数组。 你必须对这个数组执行 n 次操作。
Michael阿明
2021/09/06
4910
LeetCode 1239. 串联字符串的最大长度(回溯/动态规划)
给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。
Michael阿明
2020/07/13
9410
LeetCode 1624. 两个相同字符之间的最长子字符串
给你一个字符串 s,请你返回 两个相同字符之间的最长子字符串的长度 ,计算长度时不含这两个字符。如果不存在这样的子字符串,返回 -1 。
Michael阿明
2021/02/19
1.4K0
LeetCode 6078. 重排字符形成目标字符串
给你两个下标从 0 开始的字符串 s 和 target 。你可以从 s 取出一些字符并将其重排,得到若干新的字符串。
Michael阿明
2022/05/30
2450
跟着leedcode刷算法 -- 字符串2
给你一个字符串 s 和一个字符串列表 wordDict 作为字典,判定 s 是否可以由空格拆分为一个或多个在字典中出现的单词。
玖柒的小窝
2021/11/07
3150
跟着leedcode刷算法 -- 字符串2
LeetCode 1910. 删除一个字符串中所有出现的给定子字符串
给你两个字符串 s 和 part ,请你对 s 反复执行以下操作直到 所有 子字符串 part 都被删除:
Michael阿明
2021/09/06
6820
LeetCode字符串高频题目整理(持续更新中)
  给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
嵌入式与Linux那些事
2021/05/20
1.3K0
LeetCode 第 198 场周赛(434/5778,前7.51%)
第二题图的边给的不一定按顺序的,我按有序的做,错误一次,第三题好难跳过了,第四题暴力超时,贪心不对。继续加油!
Michael阿明
2021/02/19
3240
推荐阅读
相关推荐
LeetCode 1903. 字符串中的最大奇数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验