在 O(n) 中使用 Hash Table 在字符串 S 中查找包含字符串 T 中所有字符的最小长度子字符串

Finding a minimum length substring in string S which contains all characters from string T using Hash Table in O(n)

我知道这个问题已经被问了不止once.My 疑惑不是找到这个问题的解法,而是正确的复杂度。 我在这里阅读了一个答案:

Minimum window width in string x that contains all characters in string y
在这个解决方案中,提出的复杂度是 O(n) 使用 hash table.Now 直到将字符串 T 的字符映射到 hash table 中是可以的,但是当涉及到从 hash 中找到最小和最大元素时table,几乎每一个回答,我都看到使用了链表,他们写道,更新链表的复杂度是O(1)。这就是疑问所在。

请考虑以下示例:

S:abcbae

T:abc

初始t["a"],t["b"]和t["c"]为-1,经过3次后分别为0,1,2 (在散列 table 中)并且双链表将包含元素 [(a,0)-(b,1)-(c,2)].

现在字符串 S 中的第四个字符是 b,所以在 DLL 中为 b 添加新的索引值之前,我需要删除它之前的实例,我必须为此遍历 DLL。

我的问题是更新DLL的解决方案是O(1),不是O(n),这会导致总复杂度O(n^2)吗?

[O(n)遍历字符串S,然后O(n)更新DLL]

如有错误请指正。

描述的数据结构是一个双向链表,可视化如下,使用answer中的例子:

HEAD <=> ('c', 0) <=> ('b', 3) <=> ('a', 5) <=> TAIL

加上数组,可视化如下:

      'a'      |      'b'      |      'c'
 {5, &list[2]} | {3, &list[1]} | {0, &list[0]}

(注意信息重复)

在所描述算法的任何时候,都需要进行以下操作:

  1. 在数组中插入一个元素
  2. 在列表中插入一个元素
  3. 查找给定字符的索引值
  4. 从列表中删除一个节点

#1 的时间复杂度为 O(1)(平凡),#2 的时间复杂度也为 O(1),因为我们选择了双向链表。

#3 的时间复杂度也是 O(1),因为我们选择了数组。对于哈希 table 支持的映射,它仍然是 O(1)。

#4 的时间复杂度为 O(1),因为我们的数组包含指向列表中每个节点的指针,并且每个字符在列表中只有一个节点,因此删除也是微不足道的。

重要的是要注意(并理解)这里在所提出算法的任何迭代中,最小值 window 不能大于上一步中已经存在的值(为什么?证明它),因此我们只需要每个字符最多个节点在字符串Y(或你的问题中的T)中。

希望对您有所帮助。