美文网首页
leetcode官方《初级算法》题集(二)字符串

leetcode官方《初级算法》题集(二)字符串

作者: 加油11dd23 | 来源:发表于2021-04-07 17:45 被阅读0次

    一、给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

    1:哈希

    2:队列

    我们也可以借助队列找到第一个不重复的字符。队列具有「先进先出」的性质,因此很适合用来找出第一个满足某个条件的元素。

    具体地,我们使用与方法二相同的哈希映射,并且使用一个额外的队列,按照顺序存储每一个字符以及它们第一次出现的位置。当我们对字符串进行遍历时,设当前遍历到的字符为 cc,如果 cc 不在哈希映射中,我们就将 cc 与它的索引作为一个二元组放入队尾,否则我们就需要检查队列中的元素是否都满足「只出现一次」的要求,即我们不断地根据哈希映射中存储的值(是否为 -1−1)选择弹出队首的元素,直到队首元素「真的」只出现了一次或者队列为空。

    在遍历完成后,如果队列为空,说明没有不重复的字符,返回 -1−1,否则队首的元素即为第一个不重复的字符以及其索引的二元组。

    Tips

    在维护队列时,我们使用了「延迟删除」这一技巧。也就是说,即使队列中有一些字符出现了超过一次,但它只要不位于队首,那么就不会对答案造成影响,我们也就可以不用去删除它。只有当它前面的所有字符被移出队列,它成为队首时,我们才需要将它移除。

    二、字符串转整数

    image.png

    这道题用自动机解,比较巧妙。

    1:思路
    5:算法
    image.png
    image.png
    3:代码(一个要注意越界,一个注意*10)
    INT_MAX = 2 ** 31 - 1
    INT_MIN = -2 ** 31
    
    class Automaton:
        def __init__(self):
            self.state = 'start'
            self.sign = 1
            self.ans = 0
            self.table = {
                'start': ['start', 'signed', 'in_number', 'end'],
                'signed': ['end', 'end', 'in_number', 'end'],
                'in_number': ['end', 'end', 'in_number', 'end'],
                'end': ['end', 'end', 'end', 'end'],
            }
            
        def get_col(self, c):
            if c.isspace():
                return 0
            if c == '+' or c == '-':
                return 1
            if c.isdigit():
                return 2
            return 3
    
        def get(self, c):
            self.state = self.table[self.state][self.get_col(c)]
            if self.state == 'in_number':
                self.ans = self.ans * 10 + int(c)
                self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN)
            elif self.state == 'signed':
                self.sign = 1 if c == '+' else -1
    
    class Solution:
        def myAtoi(self, str: str) -> int:
            automaton = Automaton()
            for c in str:
                automaton.get(c)
            return automaton.sign * automaton.ans
    
    

    三、实现 strStr()

    给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
    KMP算法

    相关文章

      网友评论

          本文标题:leetcode官方《初级算法》题集(二)字符串

          本文链接:https://www.haomeiwen.com/subject/lvvjhltx.html