2014-03-03 3 views
-1

감안할 사전 유효 워드로 문자의 스트링을 분할 :크로스는 :

  1. 공백 제거와 소문자로 변환하는 구 - 예를 "ashotinthearm"에서 "팔에 주사"; (모두가 true를 돌려주는 것 등, "재", "샷", "핫", "로", "A"를,) true 또는 단어가 존재하는 경우는 false를 돌려줍니다
  2. 사전 적

무엇 공백으로 붙일 때 그 어구를 구성하는 개별 단어를 찾는 효율적인 방법입니까?

일부 횡설수설 경우에도, 하나 개 이상의 솔루션이있을 수 있습니다 : (경향 같이 의도 한대로)

  • ashotinthearm (팔에 주사, 팔에 뜨거운)
  • 가 asintended
  • guysanddolls (남자와 인형, 남자 모래 인형)
  • haveascrewloose
  • brothersinlaw (법률, 형제의 죄의 법 형제)
  • (느슨한 나사를 가지고는, 느슨한 승무원이)
  • ifeelthepinch (나는 핀치 느낌 장어 핀치 경우)
  • isinyourcourt는
  • manorhouse (매너 하우스, 남자 또는 집)
  • manormouse (남자 또는 마우스 (법원에, 당신의 법원 죄) 영주 마우스)
  • 뉴질랜드 (뉴질랜드, 새로운 열성과)
  • oneatatime (한 번에 하나씩)
  • portableradio (휴대용 라디오, 포트 수 라디오)
  • scotspine (구주 소나무를 한 번에 먹는에, 스코틀랜드 스코틀랜드)
  • ,
  • shopsoiled 이상적 및/또는 정규식 솔루션 펄 선호

(상점, 기름칠 상점을 오염), 그러나 어떤 제안에 대한 감사.

+0

이 할 어려울 것이다. 어디에 정규식을 강조 할 것인가 .. – sln

+0

이런 식으로 리눅스 명령을 사용하지 않습니까? 비슷한 문장이나 단어로 된 anagram을 찾습니다. – TLP

답변

1

이 재귀 솔루션은 어떻습니까?

#!/usr/bin/perl -wW 

use strict; 

#global "constants" 
my @words=("a", "as", "ash", "shot", "hot", "in", "the", "arm"); 
my %wordsHash = map { $_ => 1 } @words; 

sub getParts([email protected]); 
sub dictionary($); 

# returns true if in dict 
sub dictionary($) { 
    my ($str) = @_; 
    return(defined($wordsHash{$str})); 
} 

# recursive function 
sub getParts([email protected]) { 
    my ($phrase, @priorWords) = @_ ; 
    print "DEBUG: step prior words(" . join(" ", @priorWords) . ") phrase($phrase) \n"; 

    #recursion end: 
    if(!$phrase) { 
     print "solution:" . join(" ", @priorWords) . "\n"; 
     return; 
    } 
    for my $i (1 .. length($phrase)) { 
     my $word = substr($phrase,0,$i); 
     if(dictionary($word)) { 
      getParts(substr($phrase,$i),(@priorWords,$word)); 
     } 
    } 
} 

getParts("ashotinthearm",()); 

출력은 다음과 같습니다

DEBUG: step prior words() phrase(ashotinthearm) 
DEBUG: step prior words(a) phrase(shotinthearm) 
DEBUG: step prior words(a shot) phrase(inthearm) 
DEBUG: step prior words(a shot in) phrase(thearm) 
DEBUG: step prior words(a shot in the) phrase(arm) 
DEBUG: step prior words(a shot in the a) phrase(rm) 
DEBUG: step prior words(a shot in the arm) phrase() 
solution:a shot in the arm 
DEBUG: step prior words(as) phrase(hotinthearm) 
DEBUG: step prior words(as hot) phrase(inthearm) 
DEBUG: step prior words(as hot in) phrase(thearm) 
DEBUG: step prior words(as hot in the) phrase(arm) 
DEBUG: step prior words(as hot in the a) phrase(rm) 
DEBUG: step prior words(as hot in the arm) phrase() 
solution:as hot in the arm 
DEBUG: step prior words(ash) phrase(otinthearm) 
+1

내용이 무엇인지 모르는 경우 [프로토 타입] (http://perldoc.perl.org/perlsub.html#Prototypes)을 사용하지 마십시오. 어떤 펄 내장 함수의 비표준 동작을 모방하는 것입니다. – TLP

+0

우아한 솔루션 인 RobbySherwood에게 많은 감사를드립니다. 핵심 통찰력은 재귀를 사용하는 것이 었습니다. 주어진 코드는 완벽하게 작동합니다. TLP는 프로토 타입과 관련하여 일부 이상한 점을 정확하게 지적합니다. 아마도 RobbySherwood는 C 배경에서 나온 것입니까? 단순한 질질 끌기 - 단순한 질질 끌기 - 더 "perlish"가되도록하려면 'if (길이 ($ phrase) == 0) -> if (!$ phrase ( ) 내 $ i (1 .. 길이 ($ phrase))에 대해 의 마지막 "return"은 (내 $ i = 1; $ i <= 길이 getParts 필요 없음' (위의 내용을 별도의 줄에 표시하는 방법을 찾지 못했습니다 ...) – mikeham

+0

예! C 배경 ... ...--) – RobbySherwood