返回介绍

solution / 1800-1899 / 1849.Splitting a String Into Descending Consecutive Values / README

发布于 2024-06-17 01:03:14 字数 4115 浏览 0 评论 0 收藏 0

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

English Version

题目描述

给你一个仅由数字组成的字符串 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 仅由数字组成

解法

方法一:DFS

从字符串的第一个字符开始,枚举所有可能的拆分位置,判断拆分出来的子串是否满足题目要求,如果满足则继续递归判断剩余的子串是否满足题目要求,直到遍历完整个字符串。

时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为字符串的长度。

class Solution:
  def splitString(self, s: str) -> bool:
    def dfs(i, x, k):
      if i == len(s):
        return k > 1
      y = 0
      for j in range(i, len(s)):
        y = y * 10 + int(s[j])
        if (x == -1 or x - y == 1) and dfs(j + 1, y, k + 1):
          return True
      return False

    return dfs(0, -1, 0)
class Solution {
  private String s;

  public boolean splitString(String s) {
    this.s = s;
    return dfs(0, -1, 0);
  }

  private boolean dfs(int i, long x, int k) {
    if (i == s.length()) {
      return k > 1;
    }
    long y = 0;
    for (int j = i; j < s.length(); ++j) {
      y = y * 10 + (s.charAt(j) - '0');
      if ((x == -1 || x - y == 1) && dfs(j + 1, y, k + 1)) {
        return true;
      }
    }
    return false;
  }
}
class Solution {
public:
  bool splitString(string s) {
    function<bool(int, long long, int)> dfs = [&](int i, long long x, int k) -> bool {
      if (i == s.size()) {
        return k > 1;
      }
      long long y = 0;
      for (int j = i; j < s.size(); ++j) {
        y = y * 10 + (s[j] - '0');
        if (y > 1e10) {
          break;
        }
        if ((x == -1 || x - y == 1) && dfs(j + 1, y, k + 1)) {
          return true;
        }
      }
      return false;
    };
    return dfs(0, -1, 0);
  }
};
func splitString(s string) bool {
  var dfs func(i, x, k int) bool
  dfs = func(i, x, k int) bool {
    if i == len(s) {
      return k > 1
    }
    y := 0
    for j := i; j < len(s); j++ {
      y = y*10 + int(s[j]-'0')
      if y > int(1e10) {
        break
      }
      if (x == -1 || x-y == 1) && dfs(j+1, y, k+1) {
        return true
      }
    }
    return false
  }
  return dfs(0, -1, 0)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文