列表

详情


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

给你一个仅由数字组成的字符串 s

请你判断能否将 s 拆分成两个或者多个 非空子字符串 ,使子字符串的 数值降序 排列,且每两个 相邻子字符串 的数值之 等于 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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool splitString(string s) { } };

python3 解法, 执行用时: 36 ms, 内存消耗: 15.9 MB, 提交时间: 2023-09-05 22:02:11

class Solution:
    def splitString(self, s: str) -> bool:
        n = len(s)
        start = 0
        # 枚举第一个子字符串对应的初始值
        # 第一个子字符串不能包含整个字符串
        for i in range(n - 1):
            start = 10 * start + int(s[i])
            # 循环验证当前的初始值是否符合要求
            pval = start
            cval = 0
            cidx = i + 1
            for j in range(i + 1, n):
                if pval == 1:
                    # 如果上一个值为 1,那么剩余字符串对应的数值只能为 0
                    if all(s[k] == '0' for k in range(cidx, n)):
                        return True
                    else:
                        break
                cval = 10 * cval + int(s[j])
                if cval > pval - 1:
                    # 不符合要求,提前结束
                    break
                elif cval == pval - 1:
                    if j + 1 == n:
                        # 已经遍历到末尾
                        return True
                    pval = cval
                    cval = 0
                    cidx = j + 1     
        return False

golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-09-05 22:01:37

func splitString(s string) bool {
next:
	for i := 1; i < len(s); i++ {
		v, _ := strconv.Atoi(s[:i]) // 由于 s 长度至多 20,无需关心是否溢出
		v--
		for t := s[i:]; t != ""; v-- {
			// 移除前导零,但不能全部移除,至少保留一位数字
			for len(t) > 1 && t[0] == '0' {
				t = t[1:]
			}
			// 判断 v 是否符合
			tmp := strconv.Itoa(v)
			if !strings.HasPrefix(t, tmp) {
				continue next
			}
			t = t[len(tmp):]
		}
		return true
	}
	return false
}

上一题