有没有快速的算法来删除字符串中的重复子串?

2024-02-04

有一个类似的字符串

"dxabcabcyyyydxycxcxz"

我想将它合并到

"dxabcydxycxz"

其他例子:“ddxddx”->“dxdx”,“abbab”->“abab”。

规则是:

if (adjacent and same): merge

# Such as 'abc', they are same, so delete one of them
# Although 'dx' is same as 'dx', they are nonadjacent, so do not delete any of them
# If one character has been deleted, don't delete any substring, include it

我已经用 Python 完成了它,但是应用于长字符串时速度很慢。

# Original string
mystr = "dxabcabcyyyydxycxcxz"
str_len = len(mystr)
vis = [1] * str_len  # Use a list to mark which char is deleted

# Enumerate the size of substring
for i in range(1,str_len):
    # Enumerate the begin of the substring
    for j in range(0, str_len):
        offset = 2 #the size of sub-str + 1
        current_sub_str = mystr[j:j+i]
        s_begin = j+i*(offset-1)
        s_end = j+(i*offset)
        # Delete all of the same char
        while((j+(i*offset) <= str_len) and current_sub_str == mystr[s_begin:s_end]
              and 0  not in vis[s_begin:s_end] and 0  not in vis[j:j+i]):
            vis[s_begin:s_end] = [0] * (s_end - s_begin)  # If it was deleted, mark it as 0
            offset += 1
            s_begin = j + i * (offset - 1)
            s_end = j + (i * offset)

res = []
for i in range(0,str_len):
    if(vis[i]!=0): res.append(mystr[i])

print "".join(res)
   

有没有更快的方法可以解决呢?

2017 年 4 月 29 日更新

抱歉,这似乎是一个 XY 问题。另一方面,也可能不是。 我正在为网络蜘蛛编写内容,并得到许多像这样的“标签路径”:

ul/li/a
ul/li/div/div/div/a/span
ul/li/div/div/div/a/span 
ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a
ul/li/ul/li/a

正如您所看到的,一些“标签路径”是相同的,因此我想折叠它们以找出是否有任何其他具有相同结构的“标签路径”。

崩溃后,我得到这样的“标签路径”。

ul/li/a
ul/li/div/div/div/a/span
ul/li/a
ul/li/ul/li/a
ul/li/a
ul/li/ul/li/a
ul/li/a
ul/li/ul/li/a

这只是我的想法,我不知道这样做是否合适。 (经过尝试,我选择了另一种方式来做到这一点)。

然而有一个有趣的问题,比如 ACM 问题。

因此,我将一个“标签路径”简化为一个角色并寻求帮助。因为我自己没有做快速的方法。 实际上,这个问题有很多我不介意的极端情况,感谢大家帮助我完成它。

谢谢大家。



看看正则表达式的威力:

>>> import re

>>> re.sub(r"(.+?)\1+", r"\1", "dxabcabcyyyydxycxcxz")
'dxabcydxycxz'

>>> re.sub(r"(.+?)\1+", r"\1", "ddxddx")
'dxdx'

>>> re.sub(r"(.+?)\1+", r"\1", "abbab")
'abab'

这会查找 1 个或多个任意字符的序列(.+?)(作为非贪婪匹配,因此它首先尝试较短的序列),然后是匹配序列的 1 次或多次重复\1+,并将其全部替换为匹配的序列\1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有快速的算法来删除字符串中的重复子串? 的相关文章

随机推荐

  • Python安装编译错误

    我希望有人可以帮助我 因为我已经被困在这个问题上有一段时间了 而且我对编译包不太熟悉 尝试安装以下软件包 https github com jhkorhonen MOODS wiki Installation https github co
  • 强制关闭 COM 端口

    我正在开发一个使用 COM 端口与外部控制器通信的应用程序 当我在连接通信电缆的情况下重新启动电脑时 Windows 7 打开该端口 但没有运行任何应用程序 因此我无法再访问它 我尝试以编程方式关闭它 但它仍然被占用 任何人都知道如何强制它
  • “VisualTree”被设置多次

    我在这个 xaml 文件中不断收到错误 属性 VisualTree 被设置多次
  • 两个视图 多个 UIPickerViews 单个出口

    我的应用程序有两个视图 具体取决于它决定加载哪个视图的方向 但是IB不允许我将两个PickerView连接到同一个OUTLET 有没有一种方法可以在代码中分配连接 以便在加载视图时将连接分配给outlet 或者我应该为每个视图做两次 或者我
  • 异常:ASP.NET MVC 控制器中的“值不在预期范围内”[重复]

    这个问题在这里已经有答案了 我有这个字符串要格式化 并且该部分抛出异常 字符串主体 private Task SendEmailConfirmation UserModel user var emailService new EmailUn
  • 执行特定的 Maven 阶段

    有没有办法执行 Maven 构建中的特定阶段 例如 如果我只想运行那些在预集成阶段执行的插件 Maven 是否提供了一种方法来做到这一点 e g mvn pre integration phase 您不能调用生命周期阶段本身 但可以调用绑定
  • 如何在后面的代码中添加两个CSS Class来控制?

    我在 ASP NET 后面的代码中设置 2 个 css 类 我可以这样做 txtBox Attributes Add class myClass1 txtBox Attributes Add class myClass2 它总是应用一个类
  • 无法更新 RVM - “致命:无法找到‘http’的远程帮助程序”

    我在 Ubuntu 8 04 上运行 RVM 1 1 6 突然无法再更新到最新版本 rvm get head Original installed RVM version rvm 1 1 6 by Wayne E Seguin email
  • 如何在 Matplotlib 中的绘图内绘制轴线?

    当我使用 Matplotlib 绘制数据时 默认情况下 轴始终绘制为框架图的框 假设我正在轴限制内绘制数据 2 lt x lt 2 and 2 lt y lt 2 但我想通过原点在该绘图区域内绘制轴线 最好沿着这些轴线绘制刻度线和刻度标签
  • AutoMapper null 源值和自定义类型转换器,无法映射?

    当将自定义类型转换器 ITypeConverter 与 AutoMapper 一起使用时 如果源值为null e g Mapper CreateMap
  • Python 类型在方法中暗示自己的类

    Edit 我注意到人们评论说类型提示不应该与 eq 当然 不应该 但这不是我问题的重点 我的问题是why该类不能用作方法中的类型提示参数 但可以在方法中使用itself 事实证明 Python 类型提示对我使用 PyCharm 时非常有用
  • java中这个说法正确吗?

    我想使用数据报套接字在两台计算机之间进行数据传输 我使用以下行 host InetAddress getByAddress mypc new byte 192 168 1 110 但是当我使用上述语句时 我收到此错误 可能会损失精度 所以我
  • 相当于: git log --exclude-author?

    在工作中 我们有一个 git 存储库 其中大部分提交都是机器人用户自动提交的 有时我更喜欢查看该存储库中的 git 日志 但看不到自动提交 我想它可以被描述为倒置的 git log author 或 git log exclude auth
  • 从 iPhone 上的视频输出获取静态图像?

    我正在编写一个应用程序来显示 iPhone 相机所看到的光照条件的统计数据 我每秒拍摄一张图像 并对其进行计算 为了捕获图像 我使用以下方法 void captureNow AVCaptureConnection videoConnecti
  • 使用 hiera 设置类参数?

    我试图弄清楚如何使用 hiera 设置类参数的值 我正在使用两个简单的类进行测试 testhiera 和 testhiera2 以下是这些课程 root puppet el7 001 modules cat testhiera manife
  • Xcode 上 Playground 的默认目录

    当我使用 Xcode 10 1 创建新的 Playground 时 它始终默认为 Library Autosave Information 我有什么办法可以改变这个吗 解决方法与symlink Close XCode gt 在终端中输入 m
  • Android Room类型转换多种枚举类型

    我正在为我的 Room 数据库编写一个类型转换器 我有几个自定义枚举类 我想在存储在数据库中时将它们全部转换为其序数 那么 有没有办法简化它 例如传递通用枚举类型 而不是为每个单独的类编写以下内容 class Converter TypeC
  • 哪个 ember.js 组件负责将模板插入到 DOM 中?

    我正在构建ember js rails应用程序 所有车把模板都存储在 js 文件中 我想了解当路由器更改状态时它们如何插入到 DOM 中 Ember 的哪一部分执行此操作 我如何告诉 ember 放置模板 现在我只能将我的模板附加到我有一个
  • Angular 4未加载组件

    我尝试在 Angular 4 应用程序中使用 Angular 路由 但该应用程序无法加载与请求的路由匹配的组件 Here is app routing module ts import NgModule from angular core
  • 有没有快速的算法来删除字符串中的重复子串?

    有一个类似的字符串 dxabcabcyyyydxycxcxz 我想将它合并到 dxabcydxycxz 其他例子 ddxddx gt dxdx abbab gt abab 规则是 if adjacent and same merge Suc