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

例如,如果“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]),

                })

            }


            

        }

    }

}


蛊毒传说
浏览 129回答 1
1回答

慕森王

您实际上只需要相同位置的字符计数,以及每个字符串中每个字符的总计数。然后对每个字符的最小计数求和,并在同一位置减去该计数。https://play.golang.org/p/pknsVfZ1ZbMpackage mainimport (&nbsp; "fmt"&nbsp; "math")func main() {&nbsp; a := []rune("abacdead")&nbsp; b := []rune("adcbadedga")&nbsp; same := 0&nbsp; chars := make(map[rune][]int)&nbsp; for i := 0; i < len(a); i++ {&nbsp; &nbsp; &nbsp; if i < len(b) && a[i] == b[i] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; same++&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; if _, ok := chars[a[i]]; !ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; chars[a[i]] = []int{0, 0}&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; chars[a[i]][0]++&nbsp; }&nbsp; for i := 0; i < len(b); i++ {&nbsp; &nbsp; &nbsp; if _, ok := chars[b[i]]; !ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; chars[b[i]] = []int{0, 0}&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; chars[b[i]][1]++&nbsp; }&nbsp; different := -same&nbsp; for char, vals := range chars {&nbsp; &nbsp; &nbsp; fmt.Println(string(char), vals[0], vals[1])&nbsp; &nbsp; &nbsp; different += int(math.Min(float64(vals[0]), float64(vals[1])))&nbsp; }&nbsp; fmt.Println("Same: ", same, "Different: ", different)}需要注意的是,总数与您所说的不一致:"abacdead""adcbadedga"相同的位置,我们有第一个和最后一个,如果我们删除它们:ad"bacdea""dcbadega",然后排序"aabcde""aabcddeg"然后我们删除不匹配的字母"aabcde""aabcde"我们应该在不同的位置有六个相同的字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go