求6和9组成的最大字符串

数字替换算法
# coding=utf-8
import sys


def solution(num):
    # 代码可以写这里
    num = str(num)
    newNum = []
    flag = 0
    for item in num:
        if flag == 0 and item == '6':
            item = '9'
            flag = 1
        newNum.append(item)
    num = ''.join(newNum)
    return num


def main():
    # 读取第一行的n
    # firstline = sys.stdin.readline().strip()
    firstline = 696
    print(solution(firstline))


if __name__ == "__main__":
    main()
可以使用以下算法来解决由前缀后缀组成最大回文串的问题: 1. **预处理**:预处理出串串价值的前缀与后缀,同时使用马拉车算法(Manacher)得到 `Mp[]` 数组,`Mp[i]` 表示以 `i` 为中心的回文串的长度信息。这里的前缀 `sum[]` 表示前 `i` 个字符的总价值 [^1][^3]。 2. **枚举切割位置**:枚举每一个切割位置,利用 `Mp[]` 数组判断切割后得到的两个字符串是否为回文串。若两个字符串均为回文串,则将对应的前缀或后缀相加,记录该值 [^3]。 3. **取最大值**:在所有满足条件的切割位置对应的计算结果中取最大值,即为由前缀后缀组成最大回文串的价值 [^3]。 以下是使用 Python 实现上述算法的示例代码: ```python def manacher(s): # 对字符串进行预处理,插入特殊字符 t = '#'.join('^{}$'.format(s)) n = len(t) Mp = [0] * n c = r = 0 for i in range(1, n - 1): i_mirror = 2 * c - i if r > i: Mp[i] = min(r - i, Mp[i_mirror]) else: Mp[i] = 0 while t[i + 1 + Mp[i]] == t[i - 1 - Mp[i]]: Mp[i] += 1 if i + Mp[i] > r: c = i r = i + Mp[i] return Mp def max_palindrome_value(s, values): n = len(s) # 计算前缀 sum_values = [0] * (n + 1) for i in range(1, n + 1): char_index = ord(s[i - 1]) - ord('a') sum_values[i] = sum_values[i - 1] + values[char_index] # 计算后缀 suffix_sum = [0] * (n + 1) for i in range(n - 1, -1, -1): char_index = ord(s[i]) - ord('a') suffix_sum[i] = suffix_sum[i + 1] + values[char_index] # 执行马拉车算法 Mp = manacher(s) max_value = 0 # 枚举切割位置 for i in range(1, n): # 判断前缀是否为回文串 left_palindrome = is_palindrome(Mp, 0, i - 1) # 判断后缀是否为回文串 right_palindrome = is_palindrome(Mp, i, n - 1) if left_palindrome and right_palindrome: current_value = sum_values[i] + suffix_sum[i] max_value = max(max_value, current_value) return max_value def is_palindrome(Mp, left, right): center = left + right + 1 length = right - left + 1 return Mp[center] >= length # 读取输入 T = int(input()) for _ in range(T): values = list(map(int, input().split())) s = input() result = max_palindrome_value(s, values) print(result) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值