【问题标题】:Transform one string to another string将一个字符串转换为另一个字符串
【发布时间】:2016-02-23 18:45:06
【问题描述】:

存在一个字符串,其字符只能是ab_,该字符串中只有一个_

在每一步,我们可以修改字符串如下:

_ 可以与其相邻字符交换,例如a_ba 可以更改为_abaab_a

只有当相邻字符与相邻字符不同时,才能将_字符与相邻字符交换。 (比如aba_ab可以转换成a_abab或者ababa_,但是ab_aab不能转换成abaa_b,因为a不能跳过a)。

给定两个字符串,初始状态和最终状态(长度相同),您必须输出将初始状态的字符串更改为最终状态的字符串所需的最少步数。

示例:

string s1 ,s2 ;
input: s1 = a_b , s2 = ab_
output: 1
input: s1 = aba_a , s2 = _baaa
output: 2

【问题讨论】:

    标签: java algorithm recursion


    【解决方案1】:

    当您将问题简单地视为图形问题时,这可以解决。

    顶点是所有可能的状态,两个顶点有一条边,如果你可以通过一次移动从一个顶点到达另一个顶点。
    现在的问题是在此图中找到从源到目的地的最短路径。

    您的代码基本上在此图上实现了DFS,但 DFS 不是最佳的。您应该尝试实现一个BFS,它保证是最优的(总是找到最短路径)。

    更复杂的优化(为了更快的运行时间)包括 A* 搜索算法和双向搜索,但您现在应该避免这些并专注于更简单的 BFS,恕我直言。

    【讨论】:

    • “顶点是所有可能的状态”,状态是指给定字符串中的每个字符。如果您可以为我提供此问题的伪代码也会更好。我在这个问题上花了很多时间
    • 顶点是您为转换字符串而生成的中间字符串,边将是您应用的操作。
    • 在问题的编辑部分,我发布了新的解决方案。对吗?
    • 您能否详细说明 DFS 不是最优的原因?
    • @piepi DFS 找到 a 路径(假设有一个,并且它没有卡在无限分支中),而不是最短路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2020-11-30
    • 2011-12-21
    • 2012-07-16
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多