Python代码无法正确返回字符串首个非重复字符的问题排查
问题分析与解决方案
你的代码核心错误在于:res数组仅记录了所有首次出现的字符,但没有剔除后续发现重复的字符。比如输入"abacabad"时,第一个字符'a'被加入res,但后续它重复出现多次,属于重复字符,不应被留在结果集中,但你的代码仍返回res[0],导致输出错误。
修正方案一:先统计频率,再按原顺序查找(推荐)
先遍历一次字符串统计所有字符的出现频率,再按原字符串顺序遍历,找到第一个频率为1的字符。这种方法时间复杂度为O(n),空间复杂度为O(1)(因为小写字母最多26种),效率最高。
class Solution(object): def nonrepeating(self, s): char_count = {} # 统计每个字符的出现次数 for char in s: char_count[char] = char_count.get(char, 0) + 1 # 按原字符串顺序寻找第一个非重复字符 for char in s: if char_count[char] == 1: return char # 无符合条件字符时返回-1 return -1
修正方案二:遍历中维护结果集
在遍历字符串时,不仅统计频率,还维护res数组:首次出现时加入,重复出现时从res中移除(需判断是否存在,避免重复移除)。这种方法逻辑直观,但数组移除操作的时间复杂度较高,适合短字符串场景。
class Solution(object): def nonrepeating(self, s): char_count = {} res = [] for char in s: count = char_count.get(char, 0) + 1 char_count[char] = count if count == 1: res.append(char) else: if char in res: res.remove(char) return res[0] if res else -1
验证输入"abacabad"
使用方案一时,统计后'a'出现4次,'b'出现2次,'c'和'd'各出现1次。按原字符串顺序遍历,第一个频率为1的字符是'c',符合预期输出。
内容的提问来源于stack exchange,提问作者vilnius19
相关产品推荐
相关产品推荐

