タグ付けされた質問 「substrings」

1
配列の連続した部分配列から合計数を数える
すべてa [ i ] > 0の配列が与えられます。a[1…n]a[1…n]a[1 \ldots n]a[i]>0a[i]>0a[i]>0 今、私たちは部分配列は、配列、すなわち、連続した範囲のです(そのサブアレイから形成することができますどのように多くの異なる合計見つける必要がある[ J ... K ]いくつかのために、合計は全ての和でありますサブアレイの要素)。例えば、場合、その後、答えは4:我々が形成することができる。a[j…k]a[j…k]a[j\ldots k]j,kj,kj,ka=[1,2,1]a=[1,2,1]a=[1,2,1]1,2,3,41,2,3,4 1,2,3,4 時間で個別の合計数をカウントする方法を知っています。O(n2)O(n2)O(n^2) さらに、私はこれが文字列の異なる部分文字列の数を見つける必要がある古典的な問題に似ていることに気付きました。私は、サフィックス配列を構築し、同様の方法で解決する可能性を考えていました(時間)。しかし、私はここで動作するようにそれを変更する方法を理解することができませんでした。たとえば、接尾辞配列を使用すると、4つの許容可能なケースの代わりに5つのケースが取得されます。これは、接尾辞配列を使用してこれを行うことは可能ですか、それとも間違った方向に考えていますか?O(n)O(n)O(n)a=[1,2,1]a=[1,2,1]a=[1,2,1] また、私が考えてきたもう1つの方向があります。分割して征服します。配列を1つの要素に縮小されるまで毎回2つの部分に分割する場合のように。1つの要素に1つの合計を含めることができます。2つの単一要素を組み合わせる場合、2つの方法で実行できます。両方の単一範囲に同じ要素がある場合、2つの異なる合計を取得するか、両方に異なる要素がある場合、3つの異なる合計を取得します。しかし、長さが1より大きい配列をマージするためにこれを一般化することはできません。2つのmサイズの配列をマージして答えを取得することは可能ですか?O(m)O(m)O(m)

1
最長のフィボナッチ部分文字列を見つけるための単純なアルゴリズムの複雑さ
2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:aa\text{a}bb\text{b}kkk F(k)=⎧⎩⎨baF(k−1)⋆F(k−2)if k=0if k=1elseF(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 文字列の連結を示します。⋆⋆\star したがって、次のようになります。 F(0)=bF(0)=bF(0) = \text{b} F(1)=aF(1)=aF(1) = \text{a} F(2)=F(1)⋆F(0)=abF(2)=F(1)⋆F(0)=abF(2) = F(1) \star F(0) = \text{ab} F(3)=F(2)⋆F(1)=abaF(3)=F(2)⋆F(1)=abaF(3) = F(2) \star F(1) = \text{aba} …

2
高速k不一致文字列マッチングアルゴリズム
高速なk不一致文字列マッチングアルゴリズムを探しています。長さmのパターン文字列Pと長さnのテキスト文字列Tが与えられた場合、Pが最大でk個の不一致を持つTの部分文字列と一致するすべての位置を見つけるための高速(線形時間)アルゴリズムが必要です。これは、k差問題(編集距離)とは異なります。不一致は、部分文字列とパターンの最大k個の位置に異なる文字があることを意味します。本当に必要なのはk = 1(最大で1つの不一致)だけなので、k = 1の特定のケースに対する高速アルゴリズムでも十分です。アルファベットのサイズは26(大文字と小文字を区別しない英語のテキスト)であるため、スペースの要件はアルファベットのサイズに比例して大きくなりすぎないようにする必要があります(たとえば、FAASTアルゴリズムは、アルファベットのサイズで指数関数的にスペースを取るなど)。タンパク質および遺伝子配列にのみ適しています)。 ダイナミックプログラミングベースのアプローチは、最悪の場合O(mn)になる傾向があり、遅くなります。私はこのためのボイヤー・ムーアアルゴリズムの変更があると信じていますが、私はそのような論文を手に入れることができません。私は学術雑誌や出版物にアクセスするためのサブスクリプションを持っていないので、すべての参照はパブリックドメインにある必要があります。 私は、ポインタ、または自由に入手できるドキュメントへの参照、またはこの問題のアルゴリズム自体に大いに感謝します。

2
Knuth-Morris-PrattアルゴリズムがBoyer-Mooreよりも速い例?
Knuth-Moriss-PrattアルゴリズムとBoyer-Mooreとの比較に関するこのページでは、Koyer-Mooreアルゴリズムがスキップ距離が短いためにKMPのパフォーマンスが向上する可能性があるケースについて説明します。 このケースを明確に示すことができる良い例(テキスト、パターン)を探しています。

1
n個の文字列が与えられた場合、それらの1つは別の部分文字列ですか?
nnn文字列のコレクションが与えられたとしますS1,…,SnS1,…,SnS_1,\dots,S_n。これらの文字列のいずれかがコレクション内の他の文字列の部分文字列であるかどうかを知りたいのですが。つまり、次のタスクのアルゴリズムが必要です。 入力:S1,…,SnS1,…,SnS_1,\dots,S_n 出力:i,ji,ji,jようなSiSiS_iの部分文字列であるSjSjS_jとi≠ji≠ji\ne j、またはNoneがない場合は、このようなi,ji,ji,jが存在 これのための効率的なアルゴリズムはありますか? 「部分文字列」を「接頭辞」で置き換える場合、効率的なアルゴリズムがあります(文字列を並べ替えてから、線形スキャンを実行して隣接する文字列を比較します。並べ替えにより、部分文字列が確実に隣接します)。しかし、文字列が他の文字列の部分文字列であるかどうかをテストすることは、より困難に思えます。単純なアルゴリズムは、すべてのペアを反復処理することですが、これにはΘ (n 2)サブストリングテストが必要です。より効率的なアルゴリズムはありますか?i,ji,ji,jΘ(n2)Θ(n2)\Theta(n^2) これを「すべてのペアの部分文字列テスト」などと呼ぶことができると思います。 私の最終的な目標は、コレクション内の何かの部分文字列である各文字列を削除することにより、コレクションをプルーニングして文字列が他の文字列の部分文字列にならないようにすることです。

1
1つのストリングのサブシーケンスで他のストリングのサブシーケンスではない
しましょう ΣΣ\Sigma アルファベットにしてみましょう x+,x−1,…,x−n∈Σ∗x+,x1−,…,xn−∈Σ∗x^+,x^-_1,\dots,x^-_n \in \Sigma^*そのアルファベットの文字列である。文字列を呼び出すs∈Σ∗s∈Σ∗s \in \Sigma^* 良ければsss のサブシーケンスです x+x+x^+ のサブシーケンスではない x−1,…,x−nx1−,…,xn−x^-_1,\dots,x^-_n。 与えられた x+,x−1,…,x−nx+,x1−,…,xn−x^+,x^-_1,\dots,x^-_n、私は最短の良い文字列を探しています sss。これに適したアルゴリズムはありますか?ワーストケースの実行時間がそれほど長くない場合でも、実用的なアルゴリズムに興味があります。私のドメインでは、文字列x+,x−1,…,x−nx+,x1−,…,xn−x^+,x^-_1,\dots,x^-_n かなり長いかもしれませんが、良い紐が存在すると思います sss それが役立つ場合、それはかなり短いです。 ケース n=1n=1n=1ある文字列の最下位サブシーケンスによって処理されます。これは別の文字列のサブシーケンスではありませんが、ケースに対処する必要がありますn>1n>1n>1。

2
サブストリングマッチングのオートマトン
与えられたいくつかのアルファベットを超える文字列として、含まれている任意の文字列を受け入れ、対応する決定性有限オートマトン(DFA)を計算するために最もよく知られたアルゴリズム何である?ssssss 私は主に最も短い時間の複雑さに関心を持っているので、O表記で最もよく知られている複雑さを教えてください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.