给定一个仅含小写字母的字符串 s ,假设 s 的一个子序列 t 的第 i 个字符 对应了原字符串中的第 pi 个字符。我们定义 s 的一个松散子序列为:对于 i > 1 总是有 pi − pi−1 ≥ 2 。设一个子序列的价值为其包含的每个字符的价值之和 ( a∼z 分别为 1∼26 ) 。 求 s 的松散子序列中的最大价值 输入一行包含一个字符串 s 输出一行包含一个整数表示答案。
azaazaz 78
s = input()
n = len(s)
p = [-1] * n
last = [-1] * 26
for i in range(n):
j = ord(s[i]) - ord('a')
if last[j] != -1 and i - last[j] < 2:
p[i] = p[last[j]]
else:
p[i] = i
last[j] = i
dp = [0] * n
dp[0] = ord(s[0]) - ord('a') + 1
for i in range(1, n):
if p[i] == p[i-1] + 1:
dp[i] = dp[i-1]
else:
dp[i] = max(dp[j] + ord(s[i]) - ord('a') + 1 for j in range(i) if p[i] - p[j] >= 2)
print(dp[-1])
基于new Bing的回答:
s = input().strip()
n = len(s)
s_ = [s[0]]
for i in range(1, n):
if s[i] != s_[-1]:
s_.append(s[i])
m = len(s_)
val = [0] * 26
for i in range(26):
val[i] = i + 1
f = [val[s_[0]]] + [0] * (m - 1)
for i in range(1, m):
f[i] = f[i - 1]
for j in range(i - 2, -1, -1):
if s_[i] != s_[j] and i - j >= 2:
f[i] = max(f[i], f[j] + val[s_[i]])
print(f[m - 1])
i,s = 0,'b'
string = "abcabcabc"
string = list(string)
string[i] = s
print(''.join(string))
bbcabcabc