Разделить строку на две подстроки, имеющие максимальное количество общих неповторяющихся символов

Опубликовано: 6 Октября, 2022

Для заданной строки str задача состоит в том, чтобы найти максимальное количество общих неповторяющихся символов, которые можно получить, разбив данную строку на две непустые подстроки.

Примеры:

Input : str = “aabbca” 
Output:
Explanation: 
Partition the string into two substrings { { str[0], … str[2] }, { str[3], …, str[5] } } 
The common non-repeating characters present in both the substrings are { ‘a’, ‘b’} 
Therefore, the required output is 2.

Input: str = “aaaaaaaaaa” 
Output: 1

Наивный подход: самый простой подход к решению этой проблемы состоит в том, чтобы перебрать символы строки и разбить строку на две непустые подстроки со всеми возможными индексами и подсчитать количество часто повторяющихся символов из двух подстрок. Выведите максимальное полученное количество.

Ниже приведена реализация вышеуказанного подхода:

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

Эффективный подход. Чтобы оптимизировать описанный выше подход, идея состоит в том, чтобы использовать хеширование и упорядоченный набор для хранения отдельных символов строки в отсортированном порядке. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте переменную, скажем, res , для хранения максимального количества общих различных символов, присутствующих в обеих подстроках, путем разделения строки на две подстроки.
  • Инициализируйте карту, скажем, mp , чтобы хранить частоту каждого отдельного символа строки.
  • Инициализируйте упорядоченный набор, скажем, Q , чтобы хранить отдельные символы строки в отсортированном порядке.
  • Перебрать символы строки и для каждого i -го символа уменьшить частоту str[i] и проверить, равна ли частота mp[str[i]] 0 или нет. Если окажется ложным, удалите str[i] из Ordered Set .
  • В противном случае вставьте str[i] в упорядоченный набор и обновите res = max(res, X) , где X — количество элементов в упорядоченном наборе.
  • Наконец, выведите значение res .

Ниже приведена реализация вышеуказанного подхода:

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