字符篇

1、第一个只出现一次的字符

问题描述:在字符串中找出第一个只出现一次的字符,如输入‘bacbd’,输出‘a’。要求时间复杂度为O(n),空间复杂度为O(1)。

解题思路:
方法一:遍历每个字符,当访问到某个字符时,在拿它与它后面的每个字符比较,如果比较完发现没有与它重复的字符,即找到,否则,没有找到。这种方法的时间复杂度为O(n*n),所以不满足要求。
方法二:如果遍历一遍字符串,能得每个字符出现的次数,然后从结果中找到次数为1的字符,不就解决问题了吗?关键在于使用什么结构存储,很容易想到python中dict,key为字符,value为出现的次数。但是这里我用list,key是list的索引,正好对应字符的ASCII值,value是该字符出现的次数。由于没有嵌套for循环,所以时间复杂度为O(n),我们假定所有字符都是ASCII表中,可以初始化一个大小为256的列表,所以空间复杂度就是O(1)。
代码如下:

def first_not_repeating_char(str):
    if not str:
        return None
    arr = [0]*256

    for ch in str:
        arr[ord(ch)] += 1

    for ch in str:
        if arr[ord(ch)] == 1:
            return ch

    return None

print(first_not_repeating_char('aabdbccc'))
#结果为: d
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,207评论 0 13
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,778评论 0 33
  • All apps provided by this developer,Lin Game Studio, on G...
    Lin_Game_Studio阅读 797评论 0 0
  • 冰激凌物语 谈到冰激凌,不免有些愧疚。想来自己吃了十五个年头的冰激凌,而叫得出名字的,不过寥寥几种而已。 第一个便...
    矢北阅读 951评论 2 2