为了账号安全,请及时绑定邮箱和手机立即绑定

打印两个字符串中相同且出现在相同位置的字符数

打印两个字符串中相同且出现在相同位置的字符数

Go
蛊毒传说 2022-09-05 17:23:51
例如,如果“abacdead”和“adcbadedga”是两个字符串,那么我们需要打印相同的位置和不同的位置。    same pos count: 2    diff pos count: 5如果我们使用循环均值,一个(第一个字母)将检查所有字符(字符串2),因此循环将运行超过140次,这里我们如何实现O(n)。如果我们有任何数据结构,请建议我解决这个问题。示例代码   func Test(a, b string) {    r := make([]map[string]interface{}, 0)    for i := 0; i < len(a); i++ {        for j := 0; j < len(b); j++ {            if string(a[i]) == string(b[j]) {                r = append(r, map[string]interface{}{                    "position": i,                    "char":     string(a[i]),                })            }                    }    }}
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您实际上只需要相同位置的字符计数,以及每个字符串中每个字符的总计数。然后对每个字符的最小计数求和,并在同一位置减去该计数。


https://play.golang.org/p/pknsVfZ1ZbM


package main


import (

  "fmt"

  "math"

)


func main() {

  a := []rune("abacdead")

  b := []rune("adcbadedga")

  same := 0

  chars := make(map[rune][]int)

  for i := 0; i < len(a); i++ {

      if i < len(b) && a[i] == b[i] {

          same++

      }

      if _, ok := chars[a[i]]; !ok {

          chars[a[i]] = []int{0, 0}

      }

      chars[a[i]][0]++

  }

  for i := 0; i < len(b); i++ {

      if _, ok := chars[b[i]]; !ok {

          chars[b[i]] = []int{0, 0}

      }

      chars[b[i]][1]++

  }


  different := -same

  for char, vals := range chars {

      fmt.Println(string(char), vals[0], vals[1])

      different += int(math.Min(float64(vals[0]), float64(vals[1])))

  }

  fmt.Println("Same: ", same, "Different: ", different)

}

需要注意的是,总数与您所说的不一致:


"abacdead"

"adcbadedga"

相同的位置,我们有第一个和最后一个,如果我们删除它们:ad


"bacdea"

"dcbadega"

,然后排序


"aabcde"

"aabcddeg"

然后我们删除不匹配的字母


"aabcde"

"aabcde"

我们应该在不同的位置有六个相同的字符。


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信