草庐IT

algorithm - 转到 : longest common subsequence to print result array

coder 2023-06-29 原文

我已经实现了最长公共(public)子序列算法并得到了最长的正确答案,但无法找出打印出最长公共(public)子序列的组成部分的方法。

也就是说,我成功获取了最长公共(public)子序列数组的长度,但我想打印出最长的子序列。

此代码的 Playground 就在这里

http://play.golang.org/p/0sKb_OARnf

/*
X = BDCABA
Y = ABCBDAB => Longest Comman Subsequence is B C B

Dynamic Programming method : O ( n )
*/

package main
import "fmt"

func Max(more ...int) int {
  max_num := more[0]
  for _, elem := range more {
    if max_num < elem {
      max_num = elem
    }
  }
  return max_num
}

func Longest(str1, str2 string) int {
  len1 := len(str1)
  len2 := len(str2)

  //in C++,
  //int tab[m + 1][n + 1];
  //tab := make([][100]int, len1+1)

  tab := make([][]int, len1+1)
  for i := range tab {
    tab[i] = make([]int, len2+1)
  }

  i, j := 0, 0
  for i = 0; i <= len1; i++ {
    for j = 0; j <= len2; j++ {
      if i == 0 || j == 0 {
        tab[i][j] = 0
      } else if str1[i-1] == str2[j-1] {
        tab[i][j] = tab[i-1][j-1] + 1
        if i < len1 {
          fmt.Printf("%c", str1[i])
        }
      } else {
        tab[i][j] = Max(tab[i-1][j], tab[i][j-1])
      }
    }
  }
  fmt.Println()
  return tab[len1][len2]
}

func main() {
  str1 := "AGGTABTABTABTAB"
  str2 := "GXTXAYBTABTABTAB"
  fmt.Println(Longest(str1, str2))
  //Actual Longest Common Subsequence: GTABTABTABTAB
  //GGGGGTAAAABBBBTTTTAAAABBBBTTTTAAAABBBBTTTTAAAABBBB
  //13

  str3 := "AGGTABGHSRCBYJSVDWFVDVSBCBVDWFDWVV"
  str4 := "GXTXAYBRGDVCBDVCCXVXCWQRVCBDJXCVQSQQ"
  fmt.Println(Longest(str3, str4))
  //Actual Longest Common Subsequence: ?
  //GGGTTABGGGHHRCCBBBBBBYYYJSVDDDDDWWWFDDDDDVVVSSSSSBCCCBBBBBBVVVDDDDDWWWFWWWVVVVVV
  //14
}

当我尝试在选项卡更新时打印出子序列时,结果是重复的。 我想为 str1 和 str2 打印出类似“GTABTABTABTAB”的内容

提前致谢。

最佳答案

编辑:看来我是仓促回答了这个问题。在维基百科页面上 Longest Common Subsequnce一旦计算出 LCS,他们就会给出打印出 LCS 的伪代码。我会在有空的时候尽快在 go up 中添加一个实现。

旧的无效答案

一旦您将某个角色注册为子序列的一部分,您就会忘记从该角色继续前进。

下面的代码应该可以工作。查看 fmt.Printf("%c", srt1[i]) 行之后的两行。

playground link

/*
X = BDCABA
Y = ABCBDAB => Longest Comman Subsequence is B C B

Dynamic Programming method : O ( n )
*/

package main

import "fmt"

func Max(more ...int) int {
    max_num := more[0]
     for _, elem := range more {
        if max_num < elem {
            max_num = elem
        }
    }
    return max_num
}

func Longest(str1, str2 string) int {
    len1 := len(str1)
    len2 := len(str2)

    //in C++,
    //int tab[m + 1][n + 1];
    //tab := make([][100]int, len1+1)

    tab := make([][]int, len1+1)
    for i := range tab {
        tab[i] = make([]int, len2+1)
    }

    i, j := 0, 0
    for i = 0; i <= len1; i++ {
        for j = 0; j <= len2; j++ {
            if i == 0 || j == 0 {
                tab[i][j] = 0
            } else if str1[i-1] == str2[j-1] {
                tab[i][j] = tab[i-1][j-1] + 1
                if i < len1 {
                    fmt.Printf("%c", str1[i])
                                            //Move on the the next character in both sequences
                    i++
                    j++
                }
            } else {
                tab[i][j] = Max(tab[i-1][j], tab[i][j-1])
            }
        }
    }
    fmt.Println()
    return tab[len1][len2]
}

func main() {
    str1 := "AGGTABTABTABTAB"
    str2 := "GXTXAYBTABTABTAB"
    fmt.Println(Longest(str1, str2))
    //Actual Longest Common Subsequence: GTABTABTABTAB
    //GGGGGTAAAABBBBTTTTAAAABBBBTTTTAAAABBBBTTTTAAAABBBB
    //13

    str3 := "AGGTABGHSRCBYJSVDWFVDVSBCBVDWFDWVV"
    str4 := "GXTXAYBRGDVCBDVCCXVXCWQRVCBDJXCVQSQQ"
    fmt.Println(Longest(str3, str4))
    //Actual Longest Common Subsequence: ?
     //GGGTTABGGGHHRCCBBBBBBYYYJSVDDDDDWWWFDDDDDVVVSSSSSBCCCBBBBBBVVVDDDDDWWWFWWWVVVVVV
    //14
}

关于algorithm - 转到 : longest common subsequence to print result array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20145795/

有关algorithm - 转到 : longest common subsequence to print result array的更多相关文章

  1. ruby-on-rails - 我需要从 HTML 转到 markdown,有什么建议吗? - 2

    我正在使用Maruku,将Markdown(超集)转换为HTML,你知道我该怎么做才能从HTML转换为Markdown吗? 最佳答案 Google发现了一个名为reverse_markdown的ruby​​脚本.它似乎可以满足您的需求。 关于ruby-on-rails-我需要从HTML转到markdown,有什么建议吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/175162

  2. ruby - 是否有任何命令可以使用 vim 转到 Ruby block 的末尾(或开始) - 2

    有没有办法使用vim结束Rubyblock?例如moduleSomeModule#defsome_methodendend我想用一个命令从光标所在的位置移动到block的末尾,这可能吗?我读过thisdocumentation,但它似乎不适用于.rb文件,我在某些地方读到它只适用于C(虽然还没有尝试过)。提前致谢。 最佳答案 rubyforge好像有官方包对此有一些支持:TheRubyftpluginnowincludesRubyspecificimplementationsforthe[[,]],[],][,[m,]m,[M,an

  3. ruby - 在 Vim 中使用 Ctags 跳转到 Ruby bang 方法 - 2

    我在使用ExhuberantCtags跳转到Rubybang方法时遇到问题。我已经搜索过其他有类似问题的人,但找不到任何东西。可以使用以下小型Rub​​y类显示该问题的示例:classHellodefstartmethod!enddefmethod#Blahenddefmethod!#Blahendend当ctags-R.在此文件上运行时,生成的tags文件包含以下两行,表明这两种方法都是在生成时发现的:methodtest.rb/^defmethod$/;"fclass:Hellomethod!test.rb/^defmethod!$/;"fclass:Hello但是,如果我将光标放

  4. ruby - “运行失败跳转到方法定义”错误 : undefined method `current_line' for TextMate:Module - 2

    更新:我想通了。Ctrl-F仅在未选择我正在搜索的方法时有效。游标只需要在方法名中。我刚升级到TextMate2。当我选择一个方法并使用Ctrl+F转到它的定义时,我得到:>FailurerunningJumptoMethodDefinition这是痕迹:/Users/ilikepie/Library/ApplicationSupport/TextMate/Managed/Bundles/RubyonRails.tmbundle/Support/lib/rails/text_mate.rb:54:in`method_missing':undefinedmethod`current_li

  5. ruby - 如何使用 Vim 从 do 跳转到 Ruby block 的末尾? - 2

    我正在使用vim进行ruby​​、php和perl开发。有快捷方式%可以从block(子例程/函数/方法/if)的开头跳转到结尾,反之亦然。对我来说,ruby中的do/end标记上的%不起作用。我如何用vim做到这一点? 最佳答案 matchitplugin允许匹配的不仅仅是括号和注释。可以找到ruby​​版本here. 关于ruby-如何使用Vim从do跳转到Rubyblock的末尾?,我们在StackOverflow上找到一个类似的问题: https://

  6. ruby - 如何从正在运行的脚本转到 IRB 提示符? - 2

    我可以从正在运行的Ruby脚本转到IRB提示吗?我想运行一个脚本,然后让它在程序中的某个点给我一个IRB提示以及程序的当前状态,但不仅仅是通过运行rdebug和设置断点。 最佳答案 Pry(一个IRB替代方案)也可以让你这样做,事实上它是为这个用例从头开始设计的:)这就像将binding.pry放在您想要开始session的位置一样简单:require'pry'x=10binding.pry在session中:pry(main)>putsx=>10查看网站:http://pry.github.com请让我们:在您的代码中的任何一点进

  7. javascript - 转到Vuejs 2中的特定路线 - 2

    我是VueJS的新手,我正在使用VueJS2Webpack模板。如果登录成功,我试图从登录组件重定向到主组件,我已经尝试了很多东西,但我仍然遇到错误。这是我的路线:constrouter=newVueRouter({mode:'history',routes:[{'name':'home',path:'/',component:require('./components/Home.vue'),beforeEnter:(to,from,next)=>{if(!localStorage.getItem('user')){next('/login')}}},{'name':'profile'

  8. javascript - 为什么我的 jest.mock 中的 Promise reject() 会转到 then() 而不是 catch()? - 2

    我有两个文件,getItemInfo.js进行API调用,getItemInfo.test.js是相应的Jest测试文件。在测试文件中,我正在模拟由Node模块request-promise触发的http调用。问题在第二个代码块上,被*********包围。基本上为什么reject()错误仍然会在第二个单元测试中进入then()block?//getItemInfo.jsconstrp=require('request-promise');constgetItemInfo=(id)=>{constroot='https://jsonplaceholder.typicode.com/po

  9. javascript - 手动转到上一个状态时 $ionicHistory.backView 的状态不正确 - 2

    我做了一个小实验:http://codepen.io/hawkphil/pen/NqMomm?editors=101这是我的状态流程(点击按钮):Home->Fact1->Fact2->Fact3->Fact2在每次状态更改时,我都会在console.log中显示$ionicHistory.backView但是,您可以在pen.js:64行中看到,奇怪的事情发生了。$ionicHistory.backView“认为”我从后退按钮到达了app.fact2,它显示app.fact1作为前一个状态(行pen.js:53)。这是不正确的,对吧?它应该将app.fact3显示为之前的状态,因为我

  10. javascript - 使用 __dirname 时如何转到父目录? - 2

    这个问题在这里已经有了答案:Howtogoback1folderlevelwith__dirname?(11个答案)关闭10个月前。目录结构:WebApiAngular色GulpFile.js测试业力.conf.js来自GulpFile.js的Gulp代码gulp.task('test',function(done){karma.start({configFile:_configFile:__dirname+'\\..\\test\\karma.conf.js',singleRun:true},done);});所以我的问题是转到父目录并访问karma.conf.js。由于某种原因,路

随机推荐