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

String 从字符串中删除重复的字符串,string,algorithm,String,Algorithm,我想尝试创建一个算法来删除字符串中的重复字符串 比如说 输入:你好 输出:直升机 输入:aazzzz5 输出:AZ5 输入:“苹果、苹果和桔子” 产量:“苹果和橙子” 我把算法写在下面() 我不知道如何修正我的算法来检查副本是否是更大图片的一部分。我有一个想法,就是通过绳子向后走,而不是向前走。任何想法/建议都会很棒 *编辑:我的原始示例不够清晰 输入Hey-Hi-Hi-Hi-Hi应该输出Hey-Hi-Hi而不是Hey-Hi,因为Hi-Hi在重复时是较大的Hey-Hi的一部分 Boots and

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

比如说

输入:你好 输出:直升机

输入:aazzzz5 输出:AZ5

输入:“苹果、苹果和桔子” 产量:“苹果和橙子”

我把算法写在下面()

我不知道如何修正我的算法来检查副本是否是更大图片的一部分。我有一个想法,就是通过绳子向后走,而不是向前走。任何想法/建议都会很棒

*编辑:我的原始示例不够清晰

输入
Hey-Hi-Hi-Hi-Hi
应该输出
Hey-Hi-Hi
而不是
Hey-Hi
,因为
Hi-Hi
在重复时是较大的
Hey-Hi
的一部分


Boots and Cats and Boots and Cats and YO
应该等于
Boots and Cats YO
而不是
Bots and Cats and Boots and Cats and YO

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

如果你想这样做的话,把你的代码拿走,但不是真的删除代码,只需跟踪删除多少,以及在哪里。每次你找到删除更多信息的方法时,都要更新这些信息


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

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

在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)与问题不匹配,但它需要有足够的空间,才能让你想要的重复真正出现在那里。我认为这表明它解决了这个问题,正如你所期望的那样


另外,4)不太匹配,但我认为这是问题中的一个输入错误。

答案不应该是
Aples and Oranges
?“Apple and Apple and Oranges”检测到的重复应该是“Apple and”。啊,所以要求只检测最大的重复单位并扔掉重复的单位?它听起来仍然有点模糊,因此一些额外的细节和示例可能会有所帮助。@K2xL您的示例不能是同一程序的输出。既然
AA
ZZ
将是最大的重复字符串,为什么
AAZZ5
->
AAZZ5
不会是最大的重复字符串呢?但是如果你选择
A
作为重复字符串,而不是
AA
,那么它实际上并不像你之前说的那样是最大的重复字符串。
str.replace(/(.+?)(\1)+/g, function(match, group){return group;})
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"