📅  最后修改于: 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的长度。