需求

输入一组字符串,将其中的常用字符查找出来,常用字符的定义为:所输入的一组字符串中,所有的字符串中都包含此字符, 则此字符就被定义为常用字符。例如,假设我们输入一组字符串为["ball", "gad", "apple"], 则最终需要返回["a"], 因为只有字符“a”在输入的3个字符串中都出现了。如果输入["cool", "lock", "cook"], 则最终的结果需要返回["c","o"], 需要注意,返回的结果中不能存在重复的字符。

思路

解决本题有两个核心点:

  1. 找到所有字符串中都包含的字符。
  2. 进行字符去重。

对于第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
}