Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求解字符串约简算法_Java_Algorithm_Pseudocode - Fatal编程技术网

Java 求解字符串约简算法

Java 求解字符串约简算法,java,algorithm,pseudocode,Java,Algorithm,Pseudocode,我正在为周一的一次面试做准备,我发现这个问题需要解决,这个问题被称为“”。问题是这样表述的: 给定一个由a、b和c组成的字符串,我们可以执行以下操作 操作:取任意两个相邻的不同字符并替换它 用第三个字符。例如,如果“a”和“c”相邻, 它们可以替换为“b”。最小的绳子是什么 重复应用此操作的结果 例如,cab->cc或cab->bb,生成一个长度字符串 2.对于这个问题,一个最佳解决方案是:bcab->aab->ac->b。无法应用更多操作,结果字符串的长度为1。 如果字符串为=CCCCC,则无

我正在为周一的一次面试做准备,我发现这个问题需要解决,这个问题被称为“”。问题是这样表述的:

给定一个由a、b和c组成的字符串,我们可以执行以下操作 操作:取任意两个相邻的不同字符并替换它 用第三个字符。例如,如果“a”和“c”相邻, 它们可以替换为“b”。最小的绳子是什么 重复应用此操作的结果

例如,cab->cc或cab->bb,生成一个长度字符串 2.对于这个问题,一个最佳解决方案是:bcab->aab->ac->b。无法应用更多操作,结果字符串的长度为1。 如果字符串为=CCCCC,则无法执行任何操作,因此 答案是5

我在stackoverflow上看到了很多,但我想验证一下我自己的算法。这是我的伪代码算法。在我的代码中

  • S是我要减少的字符串
  • S[i]是索引i处的字符
  • P是一个堆栈:
  • redux是减少字符数的函数

    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)}
    
  • 我的算法的最坏情况是O(n),因为堆栈p上的所有操作都在O(1)上。我在上面的例子中尝试了这个算法,得到了预期的答案。 让我用这个例子“abacbcaa”执行我的algo:

    我在不同的例子上运行过这个算法,看起来很有效。 我用Java编写了一段代码来测试这个算法,当我向系统提交代码时,我得到了错误的答案。我已经发布了java代码,以便您可以看到它


    有人能告诉我我的算法有什么问题吗

    我将尝试解释一下
    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