python第一个只出现一次的字符

'''
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,
并返回它的位置, 如果没有则返回 -1(需要区分大小写).

不能用python中的字典结构来实现,因为字典中的键是无序排列的

对原来的长字符串进行遍历和索引,填充如下三个列表中的数值:
char_list    长度为原始字符串中一共出现了多少个不同的字符,每个元素为不重复的字符
index_list   char_list中的每个字符串出现在原始字符串中的第一个位置索引
flag_list    表示char_list中的字符是否在原始长字符串中只出现一次
三个列表长度相等
'''

# -*- coding:utf-8 -*-
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if s=='':
            return -1
        if len(s)==1:
            return 0
        char_list=[]
        index_list=[]
        flag_list=[]

        for i,c in enumerate(s):
            if c not in char_list:
                char_list.append(c)
                index_list.append(i)
                flag_list.append(True)
            else:
                position=char_list.index(c)
                flag_list[position]=False
        # print(char_list,index_list,flag_list)
        for pos,flag in enumerate(flag_list):
            if flag:
                return index_list[pos]
        return -1
if __name__=='__main__':
    print(Solution().FirstNotRepeatingChar('google'))

下面给出第二种方法,也是书上给出的,

'''
之前我想过为当前字符串构建字典,字典中的键是长字符串中每一个不同的字符,值是字符在长字符串中出现的次数,然后输出
第一个键值为1的索引,但是字典不是顺序的数字结构,字典并没有顺序,所以需要使用顺序表(python中的顺序表/数组就是列表)
为当前输入的长字符串构建哈希表,哈希表以列表形式/顺序表存储
由于会出现所有的大写字母和所有的小写字母,故而哈希表的长度为256
字符长度为8的数据类型,共有256种可能,于是创建一个长度为256的列表
因为a的ASCII码值为65,   z的ASCII码值为122
构建好哈希表之后,由于哈希表是顺序存储的,所以仍然不知道在原字符串中出现的第一个字符是什么
故而需要对原字符串进行再次遍历
'''
# -*- coding:utf-8 -*-
class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        if s=='':
            return -1
        if len(s)==1:
            return 0

        hash_table=[0]*256
        for c in s:
            hash_table[ord(c)]+=1
        for i,c in enumerate(s):
            if hash_table[ord(c)]==1:
                return i
        return -1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值