【问题标题】:Find the minimum number of needed transformations given input and target string找到给定输入和目标字符串所需的最少转换次数
【发布时间】: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)

在给定输入和目标的情况下,可能没有解决方案,这也应该引起注意。

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

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

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

    a -> ab ab -> ab abb -> abbb ...

我如何知道何时需要停止构建图表?

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

【问题讨论】:

  • 我会先在C(或任何语言)外部设计算法,然后 C编写。
  • 我同意WhozCraig。问题在于算法本身。我不知道如何开始。
  • 如果您还没有,请查看Formal GrammarsParsing。我知道这是一个很大的话题,但是如果你能弄清楚你正在处理的语法的类型/复杂性,你就可以很容易地找到可以解析它的算法(或者它是Context-Sensitive,因此非常困难)。
  • 你的语法是不是只有a&b这两个元素?
  • 没有 amin k。它可以有更多的元素。

标签: c string algorithm


【解决方案1】:

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

编辑

图片:先修改字符串宽度

每一层都是通过将所有可能的规则应用于所有可能的子字符串而从前一层组成的。例如,b->ba 规则可以应用于每个babba。重要的是只应用一个规则,然后在列表中记住该字符串(例如 ababa 和 abbaa)。在开始下一层之前,您必须在程序的列表中完全拥有每一层(=宽度优先)。

编辑 2

你写你现在有一个输出c。为此,您显然需要一个带有XX->c 的规则。所以说你有规则aaa->c。现在在第 2 层,您将有一个字符串 aaa,它来自一些 a->aa 规则。然后,您将再次应用a->aa 并获得aaaa,这没关系,因为您应该首先考虑广度,然后您将应用aaa->c 规则到aaa,现在第3 层由aaaa、@987654336 组成@ 和别的。你不要继续修改aaaa,因为那会进入第4层,你已经在第3层找到了目标c,所以你可以停止。

编辑 3

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

但是对于具体的规则,您可以判断您是否可以达到输出。

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

【讨论】:

  • 想象一个图表。字符串(原始、目标和中间)是该图中的一个节点,转换是该图中的有向边。
  • 但是如何在图中生成中间节点呢?我的意思是,继续生成中间字符串的算法是什么,我什么时候停止?想象一下没有解决办法,我什么时候停下来?
  • 我会画一张速写。一分钟。
  • 非常感谢eznme。一旦有了基础,我想我就能做点什么……
  • 当然。扩展答案。
猜你喜欢
  • 2019-08-06
  • 2010-12-07
  • 2015-06-10
  • 2020-08-10
  • 2019-10-08
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多