与えられた文字列に対して可能な分割の数を考えてみてください。n
文字列に文字が含まれている場合はn-1
、分割する可能性のある場所があります。たとえば、文字列cat
の場合、の前に分割したり、の前にa
分割したりできますt
。これにより、4つの分割が可能になります。
この問題は、文字列を分割する必要がある場所を選択することと見なすことができます。また、分割の数を選択する必要があります。したがって、Sum(i = 0 to n - 1, n - 1 choose i)
分割の可能性があります。xとyの両方が1である二項係数の定理により、これはpow(2、n-1)に等しくなります。
確かに、この計算の多くは一般的なサブ問題に基づいているため、動的計画法によってアルゴリズムが高速化される可能性があります。頭から離れて、aを計算する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
その場合、解は= 。の条件を持つ整数のシーケンス(i0、j0、i1、j1、...)になりますi sub (k + 1)
。
あなたの目標が正しくキャメルケースのURLである場合、私は問題を回避し、もう少し直接的なものを探します。URLのホームページを取得し、ソースHTMLからスペースと大文字を削除して、文字列を検索します。一致するものがある場合は、元のHTMLでそのセクションを見つけて、それを返します。次のように、元の文字列で発生する空白の量を宣言するNumSpacesの配列が必要になります。
Needle: isashort
Haystack: This is a short phrase
Preprocessed: thisisashortphrase
NumSpaces : 000011233333444444
そしてあなたの答えはから来るでしょう:
location = prepocessed.Search(Needle)
locationInOriginal = location + NumSpaces[location]
originalLength = Needle.length() + NumSpaces[location + needle.length()] - NumSpaces[location]
Haystack.substring(locationInOriginal, originalLength)
もちろん、madduckets.comのホームページのどこかに「MadDuckets」がなかった場合、これは壊れます。悲しいかな、それは指数関数的な問題を回避するためにあなたが支払う代償です。