私は月曜日に行ったインタビューのために自分自身を準備しています。この問題を解決して "String Reduction"という名前の問題が見つかりました。問題はこのように述べている:文字列削減アルゴリズムを解決する
私はstackoverflowの上でたくさん questions and answersを見てきましたは、a、b及びcのからなる文字列を考えると、我々は次のよう 操作を行うことができます任意の2つの隣接の異なる文字を取り、3番目の文字で を交換してください。たとえば、 'a'と 'c'が隣接している場合、 は 'b'で置き換えることができます。この操作を繰り返して適用すると、 の結果が得られる最小の文字列は何ですか?
たとえば、cab - > ccまたはcab - > bbで、長さが の文字列になります。2.これは、bcab - > aab - > ac - > bです。これ以上の操作は適用されず、結果の文字列は、文字列は= CCCCCであれば、何も操作を行うことができないので、 答えは5
が、ある長さ1 を持ってすることができます自分のアルゴリズムを検証したいと思います。私のアルゴリズムは擬似コードです。私のコード
- でSは、私の文字列がインデックスで
- S [i]にある文字を削減することである私
- Pがスタックです:
Reduxのは、文字を低減する機能です。スタックP上のすべての操作はO(1)であるため
function reduction(S[1..n]){ P = create_empty_stack(); for i = 1 to n do car = S[i]; while (notEmpty(P)) do head = peek(p); if(head == car) break; else { popped = pop(P); car = redux (car, popped); } done push(car) done return size(P)}
私のアルゴリズムの最悪の場合はO(N)です。私は上記の例でこのアルゴリズムを試して、私は期待される答えを得る。私はこのような様々な例で、このアルゴリズムを実行している
i = 1 :
car = S[i] = a, P = {∅}
P is empty, P = P U {car} -> P = {a}
i = 2 :
car = S[i] = b, P = {a}
P is not empty :
head = a
head != car ->
popped = Pop(P) = a
car = reduction (car, popped) = reduction (a,b) = c
P = {∅}
push(car, P) -> P = {c}
i = 3 :
car = S[i] = a, P = {c}
P is not empty :
head = c
head != car ->
popped = Pop(P) = c
car = reduction (car, popped) = reduction (a,c) = b
P = {∅}
push(car, P) -> P = {b}
...
i = 5 : (interesting case)
car = S[i] = c, P = {c}
P is not empty :
head = c
head == car -> break
push(car, P) -> P = {c, c}
i = 6 :
car = S[i] = b, P = {c, c}
P is not empty :
head = c
head != car ->
popped = Pop(P) = c
car = reduction (car, popped) = reduction (b,c) = a
P = {c}
P is not empty : // (note in this case car = a)
head = c
head != car ->
popped = Pop(P) = c
car = reduction (car, popped) = reduction (a,c) = b
P = {∅}
push(car, P) -> P = {b}
... and it continues until n
、動作しているようです: 私はこの例で「abacbcaaを」私のアルゴを実行してみましょう。 私はこのアルゴリズムをテストするJavaでコードを書いています。コードをシステムに提出すると、私は間違った答えを得ています。私はgisthubにJavaコードを掲載していますので、あなたはそれを見ることができます。
私のアルゴリズムに何が問題なのか教えてもらえますか?
が、それは意味し、あなたそれを見つける必要があります。最初の削減方法を探しているように見えますが、もちろん失敗します。ルールを使用せず、より多くの文字が来るのを待つときに、より良い結果が得られることがあります。 – nhahtdh
@acacute yeapですが、最初のケースでは、最初の文字のみです。 forループごとに、スタックには少なくとも1つの文字が含まれます。 – Dimitri
@nhahtdhあなたはもっと具体的なことができますか? – Dimitri