原始问题:
小美设定01串权值:单字符取反确保相邻各异,输出非空子串权值总和
要解决这个问题,我们首先需要明确如何计算所有非空子串的权值和。这里的“权值”定义为将相邻字符变得不同的最小操作次数。为了高效地求解这一问题,我们可以采用动态规划的策略。
具体来说,我们定义一个数组dp,其中dp[i]表示以第i个字符结尾的所有子串的权值和。根据这个定义,我们可以推导出状态转移方程:
- 如果当前字符与前一个字符相同(即
s[i] == s[i-1]),那么dp[i] = dp[i-1] + 1,因为在这种情况下,我们需要至少一次操作来使这两个相邻字符不同。 - 如果当前字符与前一个字符不同(即
s[i] != s[i-1]),则dp[i] = dp[i-1],因为此时不需要额外的操作。
初始化时,令dp[0] = 0,表示空串的权值和为零。随后,我们遍历字符串中的每个字符,依据上述规则更新dp数组,并累加到总的权值和中。最终返回的就是所求的总权值和。
以下是使用Python实现上述算法的一个示例代码:
def calculate_weight(s):
n = len(s)
dp = [0] * (n+1)
total_weight = 0
for i in range(1, n+1):
if s[i-1] == s[i-2]:
dp[i] = dp[i-1] + 1
else:
dp[i] = dp[i-1]
total_weight += dp[i]
return total_weight
# 测试示例
s = input() # 输入字符串
weight_sum = calculate_weight(s)
print(weight_sum)通过这种方式,我们可以在O(n)的时间复杂度内计算出给定字符串的所有非空子串的权值和,其中n是字符串的长度。
Prev:进销存主业务流