首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当有需要用蟒蛇熊猫替换的字符串时,如何有效地避免替换子字符串?

当有需要用蟒蛇熊猫替换的字符串时,如何有效地避免替换子字符串?
EN

Stack Overflow用户
提问于 2019-08-07 11:21:24
回答 1查看 50关注 0票数 1

我想用它们的链接来更新单词/短语。

然而,由于短语可能是其他词的子串,我正在寻找一种有效的方法来替换所有的单词/短语而不重复替换。

替换列表

A的一个例子:在“>>”之后,需要用相应的标记链接替换以下单词/短语:

  1. ABC苹果>> [ABC Apple](http://abc_apple)
  2. 苹果>> [ABC Apples](http://abc_apples)
  3. 苹果>> [Apple](http://apple)
  4. 苹果>> [Apples](http://apples)
  5. 苹果派>> [Apple Pie](http://apple_pie)
  6. 红苹果>> [Red Apple](http://red_apple)
  7. 红苹果派>> [Red Apple Pie](http://red_apple_pie)

Idea

当每个单词/短语(子字符串)存储包含它们的单词/短语(字符串)的数据结构(例如list_l)时,我们可以在检查句子是否包含子字符串之前检查句子是否包含list_l中的元素。

例如,现在我们有以下子字符串:{list_l(string)}

  • ABC苹果:{ABC苹果}
  • ABC苹果:{}
  • 苹果:{ABC苹果,ABC苹果,苹果,苹果派,红苹果,红苹果派}
  • 苹果:{}
  • 苹果派:{红苹果派}
  • 红苹果:{红苹果派}
  • 红苹果派:{}

但是,计算工作将非常安静,因为list_l中的每个元素仍然需要检查该元素的list_l。

示例

有些句子可以替换为示例(从后面走过去):

  1. “我爱苹果派”:红苹果派(X) >>红苹果(X) >>苹果派(O) >>红苹果派(X)
  2. “我喜欢ABC苹果!”:红苹果派(x) >> >> Apple Pie(x) >> Apple(x) >> Apple(x) >> Red Apple Pie(x) >> >> Apple Pie(x) >> Red Apple Pie(x) >> Apple (X) >> ABC Apples(x) >> ABC Apple(o) >> ABC Apples(x) >> ABC Apples(x) >>>> Red Apple Pie(x) >> Apple (X)>>ABC Apples (X)>>ABC Apples (o) >>ABC Apples(X)>>ABC Apples(X)

计算工作量O(n^3)句子长度x替换列表长度x list_l长度

(原句>>结果句:)

预期结果

代码语言:javascript
运行
复制
"I like ABC Apple!"` >> `"I like [ABC Apple](http://abc_apple)!"

错误结果

代码语言:javascript
运行
复制
"I like ABC Apple!"` >> `"I like ABC [Apple](http://apple)!"
EN

回答 1

Stack Overflow用户

发布于 2019-08-07 13:18:44

存在一个贪婪的朴素O(MN + MlogM)解决方案(字符串的N大小和所有替换的M大小)。

第一段是按长度(O(MlogM))对可能的替换进行排序。

然后在原来的句子中搜索一个替换,如果发现替换,则执行替换(O(N))。每次替换都需要这样做;O(MN)也是如此。

你按顺序搜索应该能解决你的问题(如果我很理解的话)。

为了在开发中保持上面的复杂性,您可能需要一些技巧才能不阅读“已经完成的替换”,但是应该不会太困难。

最后,我认为可以使用一些数据结构来实现时间复杂度较低的解决方案,但更难实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57393257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档