文字列内の繰り返し文字列を削除するアルゴリズムを作成してみました。
例えば
入力: Hello 出力: Helo
入力: AAAAZZZZ5 出力: AZ5
入力: 「リンゴとリンゴとオレンジ」 出力: 「リンゴとオレンジ」
以下にアルゴリズムを書きました(JSFiddle here)
function removeRepeat(str)
{
var index = 0;
var tempS = str.length;
var currentBuffer = "";
var repeatCharIndex = 1;
console.log(str);
for (var i = 1; i < tempS; i++)
{
var curChar = str[i];
for (var j = 0; j < i; j++)
{
// check if duplicate
if (str[j] === curChar)
{
console.log("duplicate detected at index ",j,str[j],"and index",i,str[i])
// we have duplicate! means we could potentially have a repeated set of characters
// i, j have same character, so let's move both forward
var aheadLeft=j, aheadRight=i;
var diff = Math.min(aheadRight-aheadLeft,tempS-aheadRight);
var repeat = true;
for (var num = 1; num < diff; num++)
{
// we go backwards...
// ashiash ...
// we are at __h___h, so now we go
// _s__s_
console.log("\tis ",str[aheadRight+num],str[aheadLeft+num])
if (str[aheadRight+num] !== str[aheadLeft+num])
{
repeat = false;
break;
}
}
if (repeat){
console.log("found repeat!",str,str[aheadLeft],aheadLeft,str[aheadRight],aheadRight);
str = str.substring(0,aheadRight)+str.substring(aheadRight+diff)
return removeRepeat(str);
}
break;
}
}
}
return str;
}
console.log("New str: "+removeRepeat("nnnnnnnnzzzzzz1"));
私が抱えている問題は、アルゴリズムが正しい結果を生成しないことです"Apples and Apples and Oranges"
繰り返される文字列は次のようにApples and
なり、結果は Apples and Oranges になるはずですが、取得しています
Aples and Apples and Orang
重複が全体像の一部であるかどうかを確認するためにアルゴリズムを修正する方法がわかりません。私が思いついたアイデアの 1 つは、ストリングを前方に進むのではなく、後方に進むことでした。どんなアイデア/ヒントも素晴らしいでしょう!
*編集: 元の例では十分に明確ではありませんでした。
入力は、繰り返しながら、より大きなものの一部であるためではなく、Hey Hi Hi Hi Hey Hi Hi Hi
出力する必要がありますHey Hi Hi Hi
Hey Hi
Hi Hi Hi
Hey Hi Hi Hi
Boots and Cats and Boots and Cats and YO
等しいべきではBoots and Cats Yo
ないBots and Cats and Boots and Cats and YO