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

Posted

技术标签:

【中文标题】从字符串中删除重复的字符串【英文标题】:Remove Repeated Strings from String 【发布时间】:2013-06-21 17:29:32 【问题描述】:

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

例如

输入:你好 输出:直升机

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

我不确定如何修复我的算法以检查重复项是否是更大图景的一部分。我的一个想法是向后而不是向前穿过绳子。任何想法/提示都会很棒!

*编辑:我在原始示例中不够清楚。

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

【问题讨论】:

不应该是Aples and Oranges吗? “Apples and Apples and Oranges”检测到的重复项应该是“Apples and”。 啊,所以要求只检测最大的重复单元并丢弃重复项?听起来还是有点模糊,所以一些额外的细节和例子可能会有所帮助。 @K2xL 你的例子不能是同一个程序的输出。为什么AAAAZZZZ5 -> AAZZ5 不会,因为AAZZ 将是最大的重复字符串? 但是如果你选择A作为重复字符串,而不是AA,那么它实际上并不是你之前说的最大的重复字符串。 【参考方案1】:

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

如果您想这样做,请获取您拥有的代码,而不是实际删除代码,只需跟踪将删除的数量和位置。每次您找到删除更多信息的方法时,请更新该信息。

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

【讨论】:

【参考方案2】:

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

javascript 中,

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

我们在这里所做的是匹配一个字符串(组 1)一次或多次,然后用一个实例替换它。第 1 组比赛是非贪婪的,所以 AAAA -> 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) 不太匹配,但我认为这是问题中的错字。

【讨论】:

以上是关于从字符串中删除重复的字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 STL 从字符串中删除重复字符

从字符串中删除重复字符

如何从字符串中删除('')[重复]

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

从分解的字符串中删除空数组元素[重复]

从字符串 Typescript 中删除非英语 [重复]