跳到正文
源码达人

【算法】查找第一次出现的唯一字符

算法 柠檬鱼

需求

输入一个字符串,编程找到此字符串中第一次出现的唯一字符,尝试将其返回,如果字符串中不存在唯一字符,则返回空字符串。例如,输入“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
}