2013-10-03 2 views
1

SQLite 데이터베이스를 사용하고 있습니다. 주어진 글자 세트 만 포함하는 단어를 가져올 수 있습니까?글자가 포함 된 필터링 된 단어 목록보기

예컨대 문자가있는 경우 : h, o, e, p, g, m

을 그리고 결과는 가정,시 등 .. 포함될 수 있습니다

2^(문자 수)를 통해
+0

단어 하나 이상을 포함해야합니다. –

+0

글자는 모든 글자를 포함해야합니다. – Raj

답변

2

은 다음과 같다 조건에 문자의 목록을 변환 :

select Word 
from words 
where 
length(
    replace(
    replace(
    replace(
    replace(
    replace(Word 
     ,'h','') 
     ,'o','') 
     ,'e','') 
     ,'p','') 
     ,'m','') 
    ) = 0 
-- In the expressions below replace 1 with the number of copies 
-- of each letter than you have 
and length(Word)-length(replace(Word,'h','')) <= 1 
and length(Word)-length(replace(Word,'o','')) <= 1 
and length(Word)-length(replace(Word,'e','')) <= 1 
and length(Word)-length(replace(Word,'p','')) <= 1 
and length(Word)-length(replace(Word,'m','')) <= 1 

아이디어는 단어의 목록에 각 문자를 제거하고 결과가 비어되고 있는지, 어떤 것을 확인하지 않는 것입니다 편지는 허용 된 것보다 더 많이 사용됩니다. 이렇게하면 원하는 결과가 생성됩니다 (demo). 다음, 각 문자에 대한 replace(를 인쇄 Word를 인쇄 한 다음 목록에서 각 문자에 대해 x을 대체 ,'x','') 인쇄 :

쿼리의 첫 번째 부분은 "재귀"문자열을 출력하는 간단한 루프에 의해 생성 될 수있다.

쿼리의 두 번째 부분은 가지고있는 각각의 고유 한 문자를 통해 "문자 인벤토리"의 해당 개수에 해당하는 식을 만들어서 생성됩니다. 예를 들어 'o' 두 개가있는 경우

and length(Word)-length(replace(Word,'o','')) <= 2 
+0

위대한 ....이 잘 작동하고 있습니다 ... 고마워 많이 제발 .. – Raj

+0

여전히 하나의 문제 : tblWord에서 단어를 선택하십시오. 길이 (바꾸기 (대체 (대체) '),' ',' '),'m ',' '),'e ','e ',' , ')) = 0 게임, 이름, 달걀, 게이지, 갱 등 ... 하지만'g '가'달걀 '한 번 뿐인 경우'게이지 '와'갱 '은 거기에 ... – Raj

+0

@Raj 표현은 방금 길어 지지만 생각은 본질적으로 동일합니다. 나는 데모도 업데이트했다. – dasblinkenlight

0

첫 번째 루프 같은 경우 좀 더 어려울 수 있습니다 (각 문자를 활성화/비활성화 문자 사용).

위의 루프 내부에서 모든 문자 조합을 통해 순열 알고리즘을 반복합니다.

관련 문제