一、题目核心描述 小红需将字符串 s 通过最少次数的替换,使其成为目标串 t 的子串。具体规则如下: 替换规则:每次可将 s 中的任意字母替换为其在字母表中相邻的字母(环形相邻,如 a 可换 b 或 z,z 可换 a 或 y),1 次替换计 1 次操作。 子串定义:若 t 可通过删除开头、结尾若干字符(可为 0 或全部)得到某字符串,则该字符串是 t 的子串(即 s 最终长度需与 t 的某子串长度一致,因此只需关注 t 中长度等于 s 的子串)。 二、输入输出描述 输入要求 输入内容 约束条件 字符串 s(待修改串) 长度 ≤ 10³,仅含小写字母 字符串 t(目标串) 长度 ≥ len (s) 且 ≤ 10³,仅含小写字母 输出要求 输出一个整数,代表将 s 改为 t 子串所需的最少替换次数。 三、示例解析 示例 1 输入 plaintext abc # s(长度 3) abbc # t(长度 4,需取长度为 3 的子串:"abb"、"bbc") 输出 1 计算逻辑 枚举 t 中长度为 3 的子串: 子串 1:"abb"(t 的前 3 个字符) 子串 2:"bbc"(t 的后 3 个字符) 计算 s 变每个子串的替换次数: 对 s="abc" → 子串 "abb": 字符对应:a→a(0 次)、b→b(0 次)、c→b(1 次,相邻替换),总次数 0+0+1=1。 对 s="abc" → 子串 "bbc": 字符对应:a→b(1 次)、b→b(0 次)、c→c(0 次),总次数 1+0+0=1。 取最小值:两个子串的替换次数均为 1,故输出 1。 示例 2 输入 plaintext zzzzzz # s(长度 6) xyzabc # t(长度 6,仅 1 个符合条件的子串:自身) 输出 9 计算逻辑 字母映射:将字母转为 0-25(a=0,b=1,…,z=25),s 中每个字符均为 z(25),t 字符对应为 x(23)、y(24)、z(25)、a(0)、b(1)、c(2)。 单个字符替换次数计算(环形最小步数:min(abs(x-y), 26-abs(x-y))): z(25)→x(23):min(2, 24)=2 次 z(25)→y(24):min(1, 25)=1 次 z(25)→z(25):min(0, 26)=0 次 z(25)→a(0):min(25, 1)=1 次 z(25)→b(1):min(24, 2)=2 次 z(25)→c(2):min(23, 3)=3 次 总次数:2+1+0+1+2+3=9,故输出 9。 四、关键规则与计算逻辑 1. 替换次数计算(核心公式) 对任意两个字母 ch1(来自 s)和 ch2(来自 t 的子串),先转为对应的数字 x(ord(ch1)-ord('a'))和 y(ord(ch2)-ord('a')),最少替换次数为:min(abs(x - y), 26 - abs(x - y))(环形字母表,顺时针、逆时针替换取最小值) 2. 子串枚举范围 t 中长度等于 s 的子串共有 len(t) - len(s) + 1 个,需逐个枚举(如 t 长度 4、s 长度 3 时,子串起始索引为 0、1,共 2 个)。 五、解题思路方向 枚举 t 的有效子串:遍历 t 中所有长度为 len(s) 的子串(起始索引 i 从 0 到 len(t)-len(s))。 计算每个子串的替换成本:对每个有效子串,逐字符计算 s 对应位置字符的替换次数,求和得到该子串的总成本。 取最小成本:所有子串的总成本中,最小值即为答案。 该思路时间复杂度为 O((len(t)-len(s)+1) * len(s)),因 len(s) 和 len(t) 均 ≤ 10³,总操作数 ≤ 10⁶,完全满足时间限制。 import sys # for line in sys.stdin: # a = line.split() # print(int(a[0]) + int(a[1])) def solution(): s =input() t=input() if s in t: return 0 s_len=len(s) t_len=len(t) n =t_len-s_len+1 res=[] for i in range(n): # t 有几个同s 长度相同的 cur=0 sub_t=t[i:i+s_len] # 根据起始位位置取t中等于s 长度的字符串 #print(s,sub_t) for j in range(s_len): x= ord(s[j])-ord('a') y=ord(sub_t[j])-ord('a') cur+=min(abs(x-y),26-abs(x-y)) res.append(cur) print(min(res)) solution()