📌  相关文章
📜  将字符串划分为子字符串以使它们按字典顺序递增的顺序的方式数量(1)

📅  最后修改于: 2023-12-03 14:53:49.531000             🧑  作者: Mango

将字符串划分为子字符串以使它们按字典顺序递增的顺序的方式数量
问题描述

给定一个字符串s,将其划分为若干个子字符串,使得这些子字符串按字典顺序递增的顺序排列,并返回方案的数量。

示例

示例1:

输入:s = "ab"
输出:1
解释:字符串本身已经满足条件。

示例2:

输入:s = "aba"
输出:2
解释:可能的方案为 ["a", "ba"] 和 ["a", "b", "a"]。

示例3:

输入:s = "abc"
输出:3
解释:可能的方案为 ["a", "b", "c"], ["ab","c"] 和 ["a", "bc"]。
解决方案

本题可以使用动态规划算法来解决。

令 dp[i] 表示以 s[i] 结尾的前缀中有多少个满足要求的方案数。

对于 j ∈ [0, i-1],如果 s[j+1] 到 s[i] 组成的子串满足字典序递增,则可以在以 s[j] 结尾的前缀中加入该子串,得到一个新的以 s[i] 结尾的前缀,即状态转移为:

dp[i] = dp[i] + dp[j]

同时,如果 s[j+1] 到 s[i] 组成的子串不满足字典序递增,则不可以将其加入以 s[i] 结尾的前缀中,因此无需进行状态转移。

最终的答案为所有 dp[i] 的和。

代码实现

Python代码实现如下:

class Solution:
    def countSubstrings(self, s: str) -> int:
        n = len(s)
        dp = [1] * n
        for i in range(1, n):
            for j in range(i):
                if s[j+1:i+1] >= s[j:i]:
                    dp[i] += dp[j]
        return sum(dp)
时间复杂度

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