Java 求解字符串约简算法
我正在为周一的一次面试做准备,我发现这个问题需要解决,这个问题被称为“”。问题是这样表述的: 给定一个由a、b和c组成的字符串,我们可以执行以下操作 操作:取任意两个相邻的不同字符并替换它 用第三个字符。例如,如果“a”和“c”相邻, 它们可以替换为“b”。最小的绳子是什么 重复应用此操作的结果 例如,cab->cc或cab->bb,生成一个长度字符串 2.对于这个问题,一个最佳解决方案是:bcab->aab->ac->b。无法应用更多操作,结果字符串的长度为1。 如果字符串为=CCCCC,则无法执行任何操作,因此 答案是5 我在stackoverflow上看到了很多,但我想验证一下我自己的算法。这是我的伪代码算法。在我的代码中Java 求解字符串约简算法,java,algorithm,pseudocode,Java,Algorithm,Pseudocode,我正在为周一的一次面试做准备,我发现这个问题需要解决,这个问题被称为“”。问题是这样表述的: 给定一个由a、b和c组成的字符串,我们可以执行以下操作 操作:取任意两个相邻的不同字符并替换它 用第三个字符。例如,如果“a”和“c”相邻, 它们可以替换为“b”。最小的绳子是什么 重复应用此操作的结果 例如,cab->cc或cab->bb,生成一个长度字符串 2.对于这个问题,一个最佳解决方案是:bcab->aab->ac->b。无法应用更多操作,结果字符串的长度为1。 如果字符串为=CCCCC,则无
function reduction(S[1..n]){
P = create_empty_stack();
for i = 1 to n
do
car = S[i];
while (notEmpty(P))
do
head = peek(p);
if( head == car) break;
else {
popped = pop(P);
car = redux (car, popped);
}
done
push(car)
done
return size(P)}
有人能告诉我我的算法有什么问题吗 我将尝试解释一下
nhahtdh
的含义。算法失败的原因有多种。但最基本的一点是,在每个时间点,只有观察到的第一个字符有机会被推到堆栈上p
。不应该是这样,因为你基本上可以从任何位置开始减少
让我给你字符串abcc
。如果我在
car = S[i];
algo运行方式为:
p = {∅}, s = _abcc //underscore is the position
p = {a}, s = a_bcc
p = {c}, s = ab_cc
在这一点上,您必须减少ccc
但还有另一个缩减:abcc->aac->ab->c
此外,返回堆栈的大小p
是错误的<代码>抄送不能减少,但
算法将返回
1
。您还应该计算跳过的次数。您还可以使用蛮力…和递归解决此问题
for all n-1 pairs(2 char) replace it with 3rd char if possible and apply reduce on this new string of length n-1
for all n-2 pairs replace it with 3rd char and apply reduce on new string
for all n-3 pairs....and so on
长度为n-1的新字符串将有n-2对,同样,长度为n-2的新字符串将有n-3对
在应用此方法时,保持存储最小值
if (new_min < min)
min = new_min
if(新的最小值
实现:它要求最小的字符串,这意味着如果有多种方法可以减少字符串,则必须找到它。你似乎只是在寻找第一种减少的方法,当然,它会失败。有时,不使用规则并等待更多字符出现可能会产生更好的结果。@a有,但只有在第一种情况下,第一个字符。在每个for循环中,堆栈将至少有一个字符。@nhahtdh您能更具体一点吗?我认为不可能获得
O(n)
算法……这个简单的算法可能很有用JavaScript很容易理解不。你需要涵盖所有案件。对于大小为n
的给定字符串,有n-1
redux导致大小为n-1
的字符串n-1
。这导致了一场战争!复杂性,这是灾难性的。必须有一种方法(动态编程等)来降低这种复杂性。
if (new_min < min)
min = new_min