【问题标题】:How to identify deltas of changes between two strings?如何识别两个字符串之间的变化增量?
【发布时间】:2012-02-29 16:02:42
【问题描述】:

我必须实现一个算法,它将两个字符串作为输入,并返回一个包含子字符串变化范围的数组。

比如说,一个范围被定义为

typedef struct _NSRange {
    NSUInteger location; // Where the affected substring begins
    NSUInteger length; // How long the affected substring is
} NSRange;

例子:

string1 = "My cat sometimes likes to eat fish.";
string 2 = "My cat always likes to drink fresh water, and eat fish.";

变化是:

  • {7,9}“有时”更改为 {7,6}“总是”
  • {26,0} 添加了“喝淡水,并且”

我需要一个包含按更改分组的子字符串的数组。在这个例子中,它看起来像这样:

  • “我的猫”
  • “总是”
  • “喜欢”
  • “喝淡水,并且”
  • “吃鱼。”

目标是突出显示现有字符串中的这些更改,为此我必须根据更改将该字符串拆分为子字符串。

在重新发明轮子之前 - 公共领域有解决方案吗?

【问题讨论】:

    标签: objective-c ios string diff delta


    【解决方案1】:

    我们将任务分成两部分。

    第 1 部分:找出差异。

    您可以使用以下代码来完成此操作,

    NSString *string1 = @"My cat sometimes likes to eat fish.";
     NSString * string2 = @"My cat always likes to drink fresh water, and eat fish.";
    NSMutableSet *set1 = [NSMutableSet setWithArray:[string1 componentsSeparatedByString:@" "]];
    NSMutableSet *set2 = [NSMutableSet setWithArray:[string2 componentsSeparatedByString:@" "]];
    [set2 minusSet:set1];
    NSLog(@"%@",set2);
    

    第 2 部分:突出显示单词。

    一旦知道单词后很容易突出显示。

    【讨论】:

    • 有趣的方法 - 但是你会如何处理这个:“我的水猫喜欢水。”; “我的水猫喜欢鱼。” - 两次出现水。
    • 更新示例:“我的水猫喜欢加盐的水。”; “我的水猫喜欢加水加糖的鱼。” - 如果根据匹配项(“fish”、“and”、“sugar.”)从左到右应用,突出显示会出现错误。
    • @MikhaloIvanokov。是的,你是对的。在这种情况下它失败了。我们可以快速破解来解决它。让我更新我的代码。
    【解决方案2】:

    您基本上是在尝试实现diff 的等价物。如维基百科页面中所述,它使用longest common subsequence problem 算法。

    【讨论】:

    • 虽然这可能在技术上回答问题,it would be preferable 让您在答案中包含链接文章的基本部分,并提供链接以供参考。
    • 感谢您的评论。 OP 在询问是否有一种算法可以实现他想要实现的目标。所以我确认了这一点,并给了他算法的名称。那是我的回答。此处链接的文章是关于 diff 的文章,重要部分是算法的名称,而不是其详细信息。
    猜你喜欢
    • 2016-02-19
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    相关资源
    最近更新 更多