【发布时间】:2013-02-22 21:54:25
【问题描述】:
假设我有一个 input 字符串,例如:aab
我得到一个 target 字符串,例如:bababa
然后给我一套转换规则。例如:
ab -> bba
b -> ba
在 C 语言中,我怎样才能找到一种算法,该算法会找到需要在输入字符串中应用以获取目标字符串的最小次转换。
在这个例子中,例如,数字是 3。因为我们会这样做:
1 - Apply rule 1 (abba)
2 - Apply rule 1 again (bbaba)
3 - Apply rule 2 (bababa)
在给定输入和目标的情况下,可能没有解决方案,这也应该引起注意。
我几乎迷失在执行此操作的策略中。我想到了创建一个自动机,但我不确定在这种情况下我将如何应用。我认为这是一个有趣的问题,我一直在网上研究,但我能找到的只是给定规则的转换,而不是如何确保它是最小值。
编辑:作为建议的答案之一,我们可以从初始字符串开始绘制一个图,并创建将转换应用于前一个节点的结果的节点。但是,在我看来,这带来了一些问题:
-
想象一下,我有一个看起来像 a --> ab 的转换。我的初始字符串是'a'。我的输出字符串是'c'。所以,我一直在做这样的转换(增长图表):
a -> ab ab -> ab abb -> abbb ...
我如何知道何时需要停止构建图表?
- 假设我有以下字符串 aaaa,并且我有一个像 aa->b 这样的转换规则。我将如何创建新节点?我的意思是,我如何找到输入字符串中的子字符串并记住它们?
【问题讨论】:
-
我会先在C(或任何语言)外部设计算法,然后用 C编写。
-
我同意WhozCraig。问题在于算法本身。我不知道如何开始。
-
如果您还没有,请查看Formal Grammars 和Parsing。我知道这是一个很大的话题,但是如果你能弄清楚你正在处理的语法的类型/复杂性,你就可以很容易地找到可以解析它的算法(或者它是Context-Sensitive,因此非常困难)。
-
你的语法是不是只有a&b这两个元素?
-
没有 amin k。它可以有更多的元素。