Mohammad-R Ответов: 1

Алгоритм всех возможных способов удаления заглавных букв в строке


Привет.
Я работаю над проектом, в котором частично мне нужна функция, которая возвращает все возможные способы удаления заглавных букв строки в виде списка или массива.

Например, моя строка: aAbBcCdD

Алгоритм или функция должны возвращать список или массив, подобный этому :

aabbccdd и
abBcCdD
aAbcCdD
aAbBcdD
aAbBcCd
abcCdD
abBcdD
abBcCd
aAbcdD
aAbcCd
aAbBcd
abcdD
abcCd
abBcd
aAbcd
abcd

Я так много искал об этом, и кто-то сказал: "используйте рекурсивную функцию, которая берет декартово произведение всех возможностей для первой буквы и функции, примененной к остальной части строки. (Если первая буква-заглавная, есть две возможности. Если первая буква строчная, то есть только одна возможность.)"

Я немного знаю о рекурсивных функциях и декартовом произведении, но понятия не имею, как это сделать !

кто-нибудь может мне помочь ?

спасибо.

Что я уже пробовал:

А Л М О с т н о т н и н г :(

BillWoodruff

Разумное ожидание того, что вы попробовали больше, чем "почти ничего", - вот о чем этот форум. Проявите некоторое усилие.

Mohammad-R

Да, я пробовал некоторые способы, но то, что я пробовал, - это какие-то глупые заявления "за" и бла-бла-бла, которые, по-моему, они не заслуживают того, чтобы использовать как "то, что я пробовал", и я удалил их !
Кроме того, нет никакого кода, который я хотел бы исправить, и мне не нужен код того, что мне нужно ! Мне нужен способ, или алгоритм, или намек на это, как сказал пполиморф.

1 Ответов

Рейтинг:
9

Patrice T

Существует множество алгоритмов для решения этой задачи.
вы можете считать, что позволить капиталу или удалить его-это двоичная вещь.
4 заглавных буквы означают 2^4 возможности. Подсчет от 0 до 15 (2^4-1) будет соответствовать всем комбинациям.

 0=> 0000b=> aAbBcCdD
 1=> 0001b=> aAbBcCd
 2=> 0010b=> aAbBcdD
 3=> 0011b=> aAbBcd
 4=> 0100b=> aAbcCdD
 5=> 0101b=> aAbcCd
 6=> 0110b=> aAbcdD
 7=> 0111b=> aAbcd
 8=> 1000b=> abBcCdD
 9=> 1001b=> abBcCd
10=> 1010b=> abBcdD
11=> 1011b=> abBcd
12=> 1100b=> abcCdD
13=> 1101b=> abcCd
14=> 1110b=> abcdD
15=> 1111b=> abcd

[Обновление]
Чтобы проверить каждый бит на заданное значение, вы должны использовать побитовые логические операторы.
(значение & 8) сообщает вам, нужно ли удалять "А" или нет.
(value & 1) сообщает вам, нужно ли удалять букву "D" или нет.
3.8 & amp;#8212; побитовые операторы & amp;laquo; изучите C++[^]


0x01AA

А 5.

Patrice T

Спасибо

Mohammad-R

Спасибо за ваш ответ.
Вы имеете в виду , что я использую список или массив двоичных файлов от 0 до ((2^n)-1) (n = количество заглавных символов), каждый бит в каждом элементе массива является одним из моих заглавных символов, а затем для каждого элемента в списке или массиве я проверяю каждый бит, а затем, если он был 1, удаляю заглавную букву в той же позиции ?! верно ?!

BillWoodruff

Мой голос за № 3. Еще один расплывчатый ответ, который, вероятно, озадачит ОП, хотя и содержит "ключ"."

Patrice T

До сих пор это был единственный ответ. Может быть, вы можете предоставить лучший вариант ?
Я просто дал подсказку, потому что операция почти ничего не сделала.

Mohammad-R

Это неразумно и несправедливо, если я ожидаю, что кто-то даст мне код ! Мне просто нужен был намек или подсказка! То, что вы сказали, - это первый и почти лучший и самый простой способ, который у меня есть сейчас ! Спасибо.

Patrice T

Надеюсь, что свинца было достаточно, чтобы построить решение.