需求

输入一个字符串,编程找到此字符串中第一次出现的唯一字符,尝试将其返回,如果字符串中不存在唯一字符,则返回空字符串。例如,输入“acddaeef”, 将返回“c”,因为字符“c”和“f”是字符串中的唯一字符,字符“c”是首次出现的。

思路

本题除了要找到字符串中的唯一字符外,更关键的是对唯一字符串出现的顺序进行记录,根据题目的要求,我们需要返回第一次出现的唯一字符。 因此,在设计算法时,我们可以采用两种不同的数据结构来分别处理“找唯一”和“定顺序”的问题。可以使用字典来处理“找唯一”的问题, 通过比较字典中的键是否重复来确定字符是否唯一。使用列表来处理“定顺序”的问题,在遍历查找过程中,依次将当前被判定为唯一的字符追加到列表中, 后面发现某个字符再次出现时,将列表中对应的字符移除,最终只需要判断列表中是否有元素即可。

实现

package chapter10

func firstUniqueChar(s string) string {
    // 记录字符是否出现
    var hash = make(map[string]int)
    // 定义字符列表
    var words []string
    for i, v := range s {
        k := string(v)
        if _, ok := hash[k]; ok {
            words = remove(words, k)
        } else {
            words = append(words, k)
            hash[k] = i
        }
    }
    if len(words) > 0 {
        return words[0]
    }
    return ""
}

// 移除元素
func remove(s []string, w string) []string {
    for i, v := range s {
        if v == w {
            return append(s[:i], s[i+1:]...)
        }
    }
    return s
}