Java 将一个字符串转换为另一个字符串

Java 将一个字符串转换为另一个字符串,java,algorithm,recursion,Java,Algorithm,Recursion,有一个字符串,其字符只能是a、b或,该字符串中只有一个。 在每个步骤中,我们都可以修改字符串,如下所示: 可以与其相邻字符交换,例如a_ba可以更改为\u aba或ab_a 仅当相邻字符与相邻字符之间存在差异时,才可以将uu字符与相邻字符之间进行交换。(例如,aba_ab可以转换为a_abab或aba_,但是ab_abb不能转换为aba_b,因为a不能跳过a) 给您两个字符串,初始状态和最终状态(长度相同),您必须输出将处于初始状态的字符串更改为处于最终状态的字符串所需的最小步骤数 例如: st

有一个字符串,其字符只能是
a
b
,该字符串中只有一个

在每个步骤中,我们都可以修改字符串,如下所示:

可以与其相邻字符交换,例如
a_ba
可以更改为
\u aba
ab_a

仅当相邻字符与相邻字符之间存在差异时,才可以将uu字符与相邻字符之间进行交换。(例如,
aba_ab
可以转换为
a_abab
aba_
,但是
ab_abb
不能转换为
aba_b
,因为
a
不能跳过
a

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

例如:

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

当你把这个问题简单地看作一个图形问题时,这个问题就可以解决了


顶点是所有可能的状态,如果可以使用单个移动从一个顶点移动到另一个顶点,则两个顶点之间有一条边。
现在的问题是在这个图中找到从源到目标的最短路径

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


更复杂的优化(为了更快的运行时间)包括*搜索算法和双向搜索,但现在应该避免这些,而应该关注更简单的BFS,IMHO。

当您将问题简单地看作一个图形问题时,这可以解决


顶点是所有可能的状态,如果可以使用单个移动从一个顶点移动到另一个顶点,则两个顶点之间有一条边。
现在的问题是在这个图中找到从源到目标的最短路径

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


更复杂的优化(为了更快的运行时间)包括*搜索算法和双向搜索,但您现在应该避免这些,并将重点放在更简单的BFS,IMHO上。

“顶点是所有可能的状态”,所说的状态是指给定字符串中的每个字符。如果你能为我提供这个问题的psedoo代码,那也会更好。我在这个问题上花了很多时间。顶点是你生成用来转换字符串的中间字符串,边是你应用的操作。在问题的编辑部分,我发布了新的解决方案。是这样吗?你能详细说明DFS不是最优的吗?@piepi DFS找到的是一条路径(假设有一条路径,并且它没有卡在无限的分支中),而不是最短的路径。“顶点是所有可能的状态”,所指的状态是给定字符串中的每个字符。如果你能为我提供这个问题的psedoo代码,那也会更好。我在这个问题上花了很多时间。顶点是你生成用来转换字符串的中间字符串,边是你应用的操作。在问题的编辑部分,我发布了新的解决方案。这是正确的吗?你能详细说明DFS为什么不是最优的吗?@piepi DFS找到的是一条路径(假设有一条路径,并且它没有卡在无限分支中),而不是最短的路径。