给定输入和目标字符串,找到所需转换的最小数量

时间:2013-02-22 21:54:26

标签: c string algorithm

鉴于我有一个输入字符串,例如:aab
我收到了一个目标字符串,例如:bababa
然后我获得了一套转换规则。例如:

ab -> bba
b -> ba

我怎么能在C中找到一个算法,该算法可以找到需要在输入字符串中应用的最小转换次数来获取目标字符串。

在这个例子中,例如,数字是3.因为我们会这样做:

1 - Apply rule 1 (abba)
2 - Apply rule 1 again (bbaba)
3 - Apply rule 2 (bababa)

如果给定输入和目标,可能会发生没有解决方案,也应该注意到。

我在做这个的策略上几乎迷失了。我想到了创建一个自动机,但我不确定在这种情况下我将如何应用。我认为这是一个有趣的问题,我一直在网上进行研究,但我能找到的只是给出规则的转换,而不是如何确保它是最小的。

编辑:作为建议的答案之一,我们可以从初始字符串开始绘制图形并创建节点,这些节点是将变换应用于前一节点的结果。但是,从我的角度来看,这会带来一些问题:

  1. 想象一下,我有一个看起来像这样的变换a - > AB。我的初始字符串是'a'。我的输出字符串是'c'。所以,我一直在做变换(增长图形),如下所示:

    a - > AB ab - > ABB abb - > AB | BB ...

  2. 我怎么知道何时需要停止构建图表?

    1. 说我有以下字符串aaaa,我有一个转换规则,如aa-> b。我该如何创建新节点?我的意思是,如何在输入字符串中找到子串并记住它们?

1 个答案:

答案 0 :(得分:3)

我认为没有一个有效的解决方案。我认为你必须做广度优先搜索。通过这样做,您将知道,只要您拥有解决方案,它就是最短的解决方案。

编辑

图片:首先修改字符串宽度

search string breadth first

通过将所有可能的规则应用于所有可能的子串,每个层都是从前一层创建的。例如,b->ba规则可以应用于每个abba的{​​{1}}。重要的是只应用单个规则,然后在列表中记住该字符串(例如ababa和abbaa)。在开始下一个Layer(=广度优先)之前,必须在程序的List中完全拥有每个图层。

编辑2

你现在写信给你有一个输出b。为此,您显然需要c的规则。所以说你有规则XX->c。现在,在第2层中,您将拥有一个来自某些aaa->c规则的字符串aaa。然后,您将再次应用a->aa并获得a->aa,这是正常的,因为您应该首先进行广度,然后将aaaa规则应用于aaa->c,现在又拥有第3层由aaaaaaa和其他人组成。您不会继续修改c,因为这会转到第4层,您已在第3层找到了目标aaaa,因此您可以停止。

编辑3

现在,您可以询问是否可以决定一组未指定的规则,以决定何时停止分层。一般来说,这是不可能的,它被称为停止问题https://en.wikipedia.org/wiki/Halting_problem

但是对于特定规则,您可以判断是否可以达到输出。

  • 示例1:如果目标包含没有规则可以提供的原子(您的'c'示例)。
  • 示例2:如果您的规则都是增加字符串的长度或保持长度不变(没有规则减少字符串的长度)
  • 示例3:如果您通过算法发现它们是循环的
  • ,则可以删除某些规则
  • 存在其他例子