需求
输入一组字符串,将其中的常用字符查找出来,常用字符的定义为:所输入的一组字符串中,所有的字符串中都包含此字符, 则此字符就被定义为常用字符。例如,假设我们输入一组字符串为["ball", "gad", "apple"], 则最终需要返回["a"], 因为只有字符“a”在输入的3个字符串中都出现了。如果输入["cool", "lock", "cook"], 则最终的结果需要返回["c","o"], 需要注意,返回的结果中不能存在重复的字符。
思路
解决本题有两个核心点:
- 找到所有字符串中都包含的字符。
- 进行字符去重。
对于第2点,我们可以借助set集合数据结构的特点来进行子字符去重。对于第1点,我们可以采用剔除法, 首先可以将第一个字符串中所有出现过的字符都认定为常用字符,之后对后面的字符串依次进行遍历,如果某个字符没有在后面的字符串中出现, 则将其剔除掉,当将所有的字符串都遍历完成后,剩下的字符即为我们筛选出的常用字符。
实现
package chapter12
func commonChars(str []string) (res []string) {
if len(str) == 0 {
return
}
var hash = make(map[string]int)
for i, v := range str[0] {
s := string(v)
hash[s] = i
}
for _, v := range str[1:] {
var swap = make(map[string]int)
for _, v := range v {
s := string(v)
if i, ok := hash[s]; ok {
swap[s] = i
}
}
hash = swap
}
for k := range hash {
res = append(res, k)
}
return
}