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

给你一个仅由数字组成的字符串 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 。
子字符串 是字符串中的一个连续字符序列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/splitting-a-string-into-descending-consecutive-values
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一次提交WA

class Solution(object):
    def dfs(self, s1, s2):
        # print(s1, '@', s2)
        if len(s2)==0:
            return  1
        for i in range(1, len(s2)+1):
            # print("#",s2[0:i])
            if int(s1[-1]) == int(s2[0:i]) + 1:
                s1.append(s2[0:i])
                if (self.dfs(s1, s2[i:]) ==1):
                    return 1
        return 0


    def splitString(self, s):
        """
        :type s: str
        :rtype: bool
        """
        for i in range(1, len(s)):
            a = []
            a.append(s[0:i])
            # print(a, '#', s[i:])
            if self.dfs(a, s[i:]) == 1:
                return True
        return False

dfs函数中s1用来保存已经分割的字符串,s2用来保存没有分割的字符串。
提交之后发现:

“200100” 未通过测试用例

调试查看输出信息:
在这里插入图片描述
在已经分好了[‘2’, ‘001’] 还有’00’没有分割时有两种情况

  1. 将’00’分割成2个数字→’0’与’0’
    ①行显示分好了[‘2’, ‘001’,‘0’] 还有’0’没有分割时,继续深搜’0’,
    ②发现数组最后一个元素’0’不等于没有分割的’0’+1 ,于是回退到已经分好了[‘2’, ‘001’] 还有’00’没有分割时的是
  2. 将’00’分割成1个数字 , 0
    发现已经分好的数里还有之前分成两个0时候的存的一个’0’,发现应该对未成功的分割进行删除。

修改代码

添加一句s1.pop()

class Solution(object):
    def dfs(self, s1, s2):
        if len(s2) == 0:
            return 1
        for i in range(1, len(s2) + 1):
            print(s1, '@', s2, "-> ",i,"->", s2[0:i], '#', s2[i:])
            if int(s1[-1]) == int(s2[0:i]) + 1:
                s1.append(s2[0:i])
                if (self.dfs(s1, s2[i:]) == 1):
                    return 1
                else:
                    s1.pop()
        return 0

    def splitString(self, s):
        """
        :type s: str
        :rtype: bool
        """
        for i in range(1, len(s)):
            a = []
            a.append(s[0:i])
            # print(a, '#', s[i:])
            if self.dfs(a, s[i:]) == 1:
                return True
        return False
if __name__ == '__main__':
    a = Solution()
    print(a.splitString(s="200100"))

重新提交
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值