#include <iostream>
#include <string>
#include <climits>
#include <cmath>
using namespace std;
string s, t;
int FindLeastReplace() {
int s_len = s.size();
int t_len = t.size();
// 题目保证 t_len >= s_len,但仍需避免无符号数下溢
if (s_len > t_len) return -1;
int bestMatch = INT_MAX;
for (int i = 0; i <= t_len - s_len; ++i) { // 滑动窗口遍历 t 中所有子串
int exchangeCount = 0;
for (int j = 0; j < s_len; ++j) { // 计算当前窗口的替换次数
char c1 = s[j];
char c2 = t[i + j];
// 令人蛋疼的细节:取环形距离的最小值(顺时针或逆时针)
int diff = abs(c1 - c2);
exchangeCount += min(diff, 26 - diff);
}
if (exchangeCount < bestMatch) {
bestMatch = exchangeCount;
}
}
return bestMatch;
}
int main() {
// 读取输入(确保读取整行,无多余空格)
getline(cin, s);
getline(cin, t);
cout << FindLeastReplace() << endl;
return 0;
}
思路是对的,但是忽略了字母表是首尾相连的

京公网安备 11010502036488号