Сделать строку анти-палиндромом

Front-end и back-end разработка Изучение

Строка S длины N называется строкой антипалиндрома, если для каждого 0 ≤ i ≤ N-1 S i != S (N — 1 − i). Задача состоит в том, чтобы вывести сформированную Анти-Палиндромную Строку, Если не удается найти, вывести «-1»

Примеры :

  • Ввод : S = «abdcccdb»
  • Вывод : «cbbaccdd»
  • Объяснение : cbbaccdd — это строка анти-палиндрома для каждого 0 ≤ i ≤ N-1, Si != S(N-1−i).
  • Вход : s = «xyz»
  • Выход : −1

Подход : проблема может быть решена на основе следующей идеи:

Если длина строки S нечетная, тогда ответ всегда будет «-1 », так как условие не выполняется для среднего элемента. Подсчитайте частоту каждого символа в строке S, если частота любого символа больше половины длины строки, то условие также не выполняется. В противном случае напечатайте строку, состоящую из символов непрерывно до их соответствующих частот.

Для реализации идеи выполните следующие шаги:

  • Проверьте длинустроки, если она нечетная, выведите «-1 ».
  • В противном случае подсчитайтечастоту каждого символа, используя карту.
  • Если частота любого символа превышает половину длины строки S, выведите «-1».
  • В противном случае напечатайте строку, состоящую из символов непрерывно до их соответствующих частот.

Ниже приведена реализация описанного выше подхода.

С++

// C++ code to implement the above approach
#include <bits/stdc++.h>
using namespace std;

// Function to check whether the string
// can be palindrome or not
string checkPalindrome(string s)
{

    // Size of string
    int n = s.size();

    // If n is odd it is impossible to make
    if (n & 1) {
        return "-1";
    }

    // Declare a Map
    map<char, int> Mp;

    // Count the frequency of each element
    for (int i = 0; i < n; i++)

        Mp[s[i]]++;

    string r = "";

    // Traverse the Map
    for (auto i : Mp) {

        int p = i.second;

        // If max frequency of any character
        // is greater than n/2 then it is
        // impossible to make Anti-palindrome
        if (p > (n / 2)) {
            return "-1";
        }

        // Else make the non-palindrome string
        for (int j = 0; j < p; j++) {

            r += i.first;
        }
    }

    // reverse the string
    reverse(r.begin(), r.begin() + n / 2);

    // return the string
    return r;
}

// Driver Code
int main()
{
    string s = "abdcccdb";

    // Function call
    cout << checkPalindrome(s) << endl;

    return 0;
}

Вывод

cbbaccdd
  • Временная сложность : O(N * log N)
  • Вспомогательное пространство : O(N)

Читайте также:  Правильно вносите изменения в свою кодовую базу
Оцените статью
bestprogrammer.ru
Добавить комментарий

Adblock
detector