Files
leetcode-master/problems/kamacoder/0157.最大化密码复杂度.md
programmercarl 574cef48b3 Update
2024-08-29 20:39:18 +08:00

1.7 KiB
Raw Blame History

最大化密码复杂度

题目链接

注意边界处理,对于字符串的首尾位置,需要特别处理,因为它们只有一个相邻字符。

  • 遍历字符串 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;
}