2012-01-21 5 views
1

의 주문을 유지하면서조합 문자열을 감안할 때 단어

예 :

Mary <1> had <2> a <3> little <4> lamb 

<number>의 각각은 참 또는 거짓 일 수 있습니다 사전에

{'Mary had a little lamb'} 
{'Mary had a little', 'lamb'} 
{'Mary had a', 'little lamb'}, {'Mary had a', 'little', 'lamb'} 
{'Mary had', 'a little lamb'}, {'Mary had', 'a little', 'lamb'}, {'Mary had', 'a', 'little lamb'}, {'Mary had', 'a', 'little', 'lamb'} 
{'Mary', 'had a little lamb'}, {'Mary', 'had a little', 'lamb'}, {'Mary', 'had a', 'little lamb'} and so on... 

감사합니다 :)

답변

4

그것에 대해 이런 식으로 생각하십시오. 그것이 사실이라면 그 위치에서 문장을 자릅니다.

0110 -> {'Mary had', 'a', 'little lamb'} 
1111 -> {'Mary', 'had', 'a', 'little', 'lamb'} 
0001 -> {'Mary had a little', 'lamb'} 
1011 -> {'Mary', 'had a', 'little', 'lamb'} 
: 당신이 N + 1 단어가있는 경우

그래서, 문제는 n 비트와 숫자의 이진 표현을 겪고로 감소됩니다, 즉 0^2 N-1

예에서입니다

+0

니스 :하지만 내 문제는 제약 조건을 가지고, 난에 <3> 또는 <4> 또는 그러한 다음 변수를 가질 수 없습니다 진실 해. 그건 질서를 유지하지 못할거야. 예 : 이러한 조합은 허용되지 않습니다. - { 'Mary', 'little lamb'} – codemaniac

+0

예를 들어 주셔서 감사합니다. – codemaniac

+0

이진 형식으로 생각하면 패턴을 찾기가 어려울 것이라고 생각하지 않습니다. 숫자? – Shahbaz

0

여기에 4 개의 단어 구분 기호 (공백)가 있습니다. 모든 공백은 문장 분리 문자로 바꿀 수 있습니다 (또는하지 않을 수도 있음). 따라서 16 = 2^4의 경우가 있는데 이진수 0000 ... 1111에 해당합니다.

1

질문에 표시된 출력을 얻으려면 동일한 순서가 아니어도되고, 이것이 내가하는 일입니다.
Mathematica 코드를 사용 하겠지만 개념은 보편적입니다.

{"Mary", "had", "a", "little", "lamb"} 
5 

string = "Mary had a little lamb"; 
set = StringSplit[string] 
n = [email protected] 

그래서 당신은 단어 (StringSplit)로 문장을 분해하는 기능이 필요합니다.

그러면 중복 요소를 인식하는 순열 함수와 integer partitions을 생성하는 함수가 필요합니다. 두 알고리즘은 StackOverflow에서 찾을 수 있습니다.

parts = Join @@ Permutations /@ IntegerPartitions[n] 
{{5}, {4, 1}, {1, 4}, {3, 2}, {2, 3}, {3, 1, 1}, {1, 3, 1}, 
{1, 1, 3}, {2, 2, 1}, {2, 1, 2}, {1, 2, 2}, {2, 1, 1, 1}, {1, 2, 1, 1}, 
{1, 1, 2, 1}, {1, 1, 1, 2}, {1, 1, 1, 1, 1}} 
: 우리는 각 파티션을 뒤 바꿔되면 ("각각은" /@입니다)

IntegerPartitions[n] 
{{5}, {4, 1}, {3, 2}, {3, 1, 1}, {2, 2, 1}, {2, 1, 1, 1}, {1, 1, 1, 1, 1}} 

우리는 모든 방법 선형 다섯 개 부분의 집합을 분할 할 수

마지막으로 함수는 일련의 길이에 따라 세트를 분할합니다.나는 광산 dynamicPartition 전화 : <2>가 false로 설정되어있는 경우, 점에서,

dynamicPartition[set, #] & /@ parts // Column 
{{Mary,had,a,little,lamb}} 
{{Mary,had,a,little},{lamb}} 
{{Mary},{had,a,little,lamb}} 
{{Mary,had,a},{little,lamb}} 
{{Mary,had},{a,little,lamb}} 
{{Mary,had,a},{little},{lamb}} 
{{Mary},{had,a,little},{lamb}} 
{{Mary},{had},{a,little,lamb}} 
{{Mary,had},{a,little},{lamb}} 
{{Mary,had},{a},{little,lamb}} 
{{Mary},{had,a},{little,lamb}} 
{{Mary,had},{a},{little},{lamb}} 
{{Mary},{had,a},{little},{lamb}} 
{{Mary},{had},{a,little},{lamb}} 
{{Mary},{had},{a},{little,lamb}} 
{{Mary},{had},{a},{little},{lamb}}