给你一个仅由数字组成的字符串 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’没有分割时有两种情况
- 将’00’分割成2个数字→’0’与’0’
①行显示分好了[‘2’, ‘001’,‘0’] 还有’0’没有分割时,继续深搜’0’,
②发现数组最后一个元素’0’不等于没有分割的’0’+1 ,于是回退到已经分好了[‘2’, ‘001’] 还有’00’没有分割时的是 - 将’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"))
重新提交