LeetCode题号:1002. 查找常用字符
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例 1:
输入:["bella","label","roller"]
输出:["e","l","l"]
示例 2:输入:["cool","lock","cook"]
输出:["c","o"]
思路:
就是挨个挨个取两数的交集 ,拿着去匹配下一个元素,直到匹配到最后,就是答案所在!
细节看代码, 不是很优雅,不断在优化,这是第一版,后期更新!
代码:
func commonChars(A []string) []string {
m := make(map[string]int)
var l []string
//用于初始化m1
var index = 0
for i := 0; i < len(A); i++ {
index++
m = getOther(index, m, A[i])
}
//m 即返回的 公共字符个数
for k, v := range m {
//大于1的既多append几次
if v > 1 {
for i := 0; i < v; i++ {
l = append(l, k)
}
} else {
l = append(l, k)
}
}
return l
}
func getOther(index int, m map[string]int, s string) map[string]int {
//用于统计字符串s的字母数量集
m1 := make(map[string]int)
//m2表示上一个交集与该字符串的公共结果集
m2 := make(map[string]int)
for i := 0; i < len(s); i++ {
m1[string(s[i])]++
}
//初始化,一开始交集为空,所以用index作为条件判断,把第一个字符串的字母数量集返回过去
if index == 1 {
return m1
}
for k, v1 := range m1 {
//判断新字符串中是否含有交集中的字母
v2, ok := m[k]
//如果key存在,则比较value(即字母个数),取交集(个数少即公共元素)
if ok {
if v1 <= v2 {
m2[k] = v1
continue
}
m2[k] = v2
}
}
//返回交集
return m2
}
往期回顾:
【1】LeetCode-409. 最长回文串(Goland实现)
【2】LeetCode-459. 重复的子字符串(Goland实现)
【3】LeetCode-53. 最大子序和(Goland实现)
❤如果文章对您有所帮助,就在文章的右上角或者文章的末尾点个赞吧!(づ ̄ 3 ̄)づ
❤如果喜欢大白兔分享的文章,就给大白兔点个关注吧!(๑′ᴗ‵๑)づ╭❤~
❤对文章有任何问题欢迎小伙伴们下方留言或者入群探讨【群号:708072830】
❤鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复讨论(请勿发表攻击言论)