주어진 문자열에 가능한 쪼개진 수를 고려하십시오. 문자열에 n
자를 입력하면 n-1
개의 분할 할 수 있습니다. 예를 들어 cat
문자열의 경우 a
전에 분할 할 수 있으며 t
전에 분할 할 수 있습니다. 이로 인해 4 가지 분할이 가능합니다.
이 문제는 문자열을 분할해야하는 부분을 선택하는 것으로 볼 수 있습니다. 또한 얼마나 많은 스플릿이 있을지 선택해야합니다. 따라서 Sum(i = 0 to n - 1, n - 1 choose i)
가능한 분할이 있습니다. Binomial Coefficient Theorem에 의해 x와 y가 모두 1 인 경우 pow (2, n-1)와 같습니다.
이 계산의 대부분은 일반적인 하위 문제에 달려 있으므로 Dynamic Programming은 알고리즘의 속도를 높일 수 있습니다. 내 머리 꼭대기에서, boolean matrix M such M[i,j] is true if and only if the substring of your given string from i to j is a word
을 계산하면 꽤 도움이 될 것입니다. 기하 급수적으로 가능한 세그먼트 수는 여전히 있지만 초기 분할이 단어를 형성하지 않으면 세그먼트 화를 신속하게 제거 할 수 있습니다. 그러면 솔루션은 j sub k
= i sub (k + 1)
인 조건의 정수 시퀀스 (i0, j0, i1, j1, ...)가됩니다.
목표가 제대로 낙타의 URL 인 경우 문제를 회피하고 조금 더 직접적으로 설명합니다. URL 홈페이지를 가져 와서 원본 HTML에서 공백과 대소 문자를 제거하고 문자열을 검색하십시오. 일치하는 항목이 있으면 원본 HTML에서 해당 섹션을 찾아서 반환하십시오.
Needle: isashort
Haystack: This is a short phrase
Preprocessed: thisisashortphrase
NumSpaces : 000011233333444444
그리고 당신의 대답에서 온 것입니다 :과 같이 원래 문자열에서 발생 얼마나 많은 공백 당신은 그 선언 NumSpaces의 배열을 필요 했어 물론
location = prepocessed.Search(Needle)
locationInOriginal = location + NumSpaces[location]
originalLength = Needle.length() + NumSpaces[location + needle.length()] - NumSpaces[location]
Haystack.substring(locationInOriginal, originalLength)
,이 경우 휴식 것이 madduckets .com은 "Mad Duckets"을 홈페이지의 어딘가에 갖고 있지 않았습니다. 아아, 기하 급수적 인 문제를 피하기 위해 지불하는 대가입니다.
실제로 배낭 문제만큼 비쌀 필요는 없습니다. 동적 프로그래밍 기법을 적용하여 검색 공간을 크게 줄일 수 있습니다. –
예, Nick Johnson과 동의합니다. 표준 O (n^2) 동적 프로그래밍 문제입니다. NP 완전한 문제에 던지기는 잭 햄머 (jackhammer)와 함께 빵을 슬라이스하려고하는 것과 같습니다 !!! –