mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-08-06 18:24:23 +08:00
1.7 KiB
1.7 KiB
最大化密码复杂度
注意边界处理,对于字符串的首尾位置,需要特别处理,因为它们只有一个相邻字符。
- 遍历字符串 s,寻找 '?' 字符。
- 对于每个 '?' 字符,选择一个字符填充,使其与前后字符都不同。这样做的目的是最大化密码的复杂度,即尽可能使相邻的字符不同。
- 如果 '?' 是第一个或最后一个字符,或者无法找到与前后都不同的字符,选择与前一个或后一个字符不同的字符。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
string s;
cin >> n >> m >> s;
if (n == 1) {
cout << 0 << endl;
return 0;
}
// 统一处理包括左右字符的情况
for (int i = 0; i < n; ++i) {
if (s[i] == '?') {
bool found = false;
for (char j = 'a'; j < 'a' + m; ++j) {
// 避免第一个字符 和 最后一个字符,因为两个字符只有一个相邻字符,没有左右相邻字符
if ((i == 0 || s[i - 1] != j) && (i == n - 1 || s[i + 1] != j)) {
s[i] = j;
found = true;
break;
}
}
// 如果没有找到合适的字符,就和附近字符保持一致
if (!found) {
if (i > 0) s[i] = s[i - 1];
else s[i] = s[i + 1];
}
}
}
// 计算结果
int result = 0;
for (int i = 0; i < n - 1; ++i) {
if (s[i] != s[i + 1]) result++;
}
cout << result << endl;
return 0;
}