Problem 2 First Non-Repeating Characters

  • use case: O(1) time + first

  • 关键词,first: 必须keep时序

  • O(1) time: Map(Key: Character, Value: ListNode) + DLL as Queue

  • 这和LRU的区别点是什么?

    • 识别那些character是non repeating,

    • 一个字母已经出现了2次vs这个字母一次都没有出现---》你怎么知道踢了vs还是放进去

Option 1: double linkedlist + map + set

API 1: new coming character:

  • double linkedlist==> 最快做删除 ==> 找到自己就能找到前一个和后一个==> 添加和删除都是O(1)的时间

  • Look up operation ==> Map<Character, ListNode> ==> 很快找到ListNode ==> Set<Character>==> help determine repeat

  • 分析

    • case 1先确认这个字母在不在set里,如果存在,直接ignore

    • case 2如果不在set里面

      • case2.1再看map,如果这个字母不在map里面

        • 这是我们第一次遇到这个字母,update Map + DLL

      • case2.2如果这个字母在map里面

        • 说明这个字母发生了重复,remove it from Map +DLL, add it to repeating set

API 2: who is the first?

  • 看看你define的DLL里哪一段是代表时间序列

Option 2: double linkedlist + map

API 1: new coming character:

  • double linkedlist==> 最快做删除 ==> 找到自己就能找到前一个和后一个==> 添加和删除都是O(1)的时间

  • Look up operation ==> Map<Character, ListNode> ==> 很快找到ListNode ==> Set<Character>==> help determine repeat

  • 分析

    • case 1先确认这个字母在不在map里

      • 如果存在对用的是reference node 是null,直接ignore

    • case 2如果不在set里面

      • case2.1再看map,如果这个字母不在map里面

        • 这是我们第一次遇到这个字母,如果这个字母不在map里面

      • case2.2如果这个字母在map里面

        • 如果是多次出现的字母,map里存的是这个字母的marker(mark this character already repeat)

          • use Null as special value

API 2: who is the first?

  • 看看你define的DLL里哪一段是代表时间序列

Last updated