题目
某年 百度的面试题。
一串首尾相连的珠子有 m 个,共有 N 种颜色(N <= 10)。设计一个算法,取出其中一段,要求包含所有 N 种颜色,并且长度最短。
思路
使用一个额外的数组 flags 存储颜色计数。若遍历的当前序列中包含了第 i 种颜色,则将数组中第 i 号元素值加 1。
使用双指针遍历原珠子数组 beads ,分别表示最短包含 N 种颜色珠子的最短子串的首尾。
- 两个指针,一开始都指向头结点。
- 指针一往后移动,在范围内,当包含了所有颜色的时候,停下来。
- 指针二往后移动,在范围内,移动的过程中判断是否包含了所有颜色,不包含的时候停下来。
- 计算此时两指针之间的距离,如果小于上一个最小记录,则更新为该距离。
- 重复以上动作直到指针一越界停止。
- 对于颜色数组,开始时数组所有元素置为0。当指针一移动时,将指针一指向的元素下标对应 flags 中元素值加一;指针二移动时,将指针二指向的元素下标对应 flags 中元素值减一。(这一段有点绕口,对照着下面的代码理解就知道了)