从字符串中删除重复的字符串

时间:2013-06-21 17:29:32

标签: string algorithm

我想尝试创建一个算法来删除字符串中重复的字符串。

例如

输入:你好 输出: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,结果应该是苹果和橘子,但我得到了

Aples and Apples and Orang 

我不确定如何修复我的算法以检查副本是否是更大图片的一部分。我的一个想法是倒退而不是前进。任何想法/提示都会很棒!

*编辑:我原来的例子中不够清楚。

输入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

2 个答案:

答案 0 :(得分:0)

我建议您做的是编写一个删除最长副本的函数,然后如果您愿意,可以多次调用它。这是我看到删除(大部分)规范中的歧义的最简单方法。

如果您想这样做,请使用您拥有的代码,而不是实际删除代码,只需跟踪将删除的内容以及删除的位置。每当您找到删除更多信息的方法时,请更新该信息。

然后,最后,删除找到的最大块(您保存的信息)。

答案 1 :(得分:0)

这将非常接近您的要求。我认为你的两个例子需要稍作改动,但没有它们似乎没有意义。

在Javascript中,

str.replace(/(.+?)(\1)+/g, function(match, group){return group;})

我们在这里做的是匹配一个字符串(组1),然后匹配一次或多次,并用一个实例替换它。第1组匹配非贪婪,因此AAAA - &gt; A代替AA

测试用例:

1) "Apples and Apples and Oranges" -> "Apples and Oranges"
2) "Hey Hi Hi Hi Hey Hi Hi Hi" -> "Hey Hi Hey Hi"
3) "Hey Hi Hi Hi Hey Hi Hi Hi " -> "Hey Hi Hi Hi "
4) "Boots and Cats and Boots and Cats and YO" -> "Boots and Cats and YO"
5) "AAAAZZZZ5" -> "AZ5"

请注意2)与问题不符,但它需要该空间才能实现您想要的重复。我认为3)表明它可以像你期望的那样解决这个问题。

另外,4)并不完全匹配,但我认为这是问题中的拼写错误。

相关问题