百度一道面试题:
有一串珠子首尾不相连,总共N个,这些珠子总共有M种颜色,在这串珠子里面找到最短的连续珠子子串,使子串出现所有的M种颜色。
毫无疑问,这个可以用暴力破解,N^2 时间效率可以解决,面试官百分之一千会让你优化。
思路:两个指针分别表示最短包含m种颜色珠子的最短子串的首尾,这个很容易想到,但是要考虑清楚边界条件,为什么说这个子串是最短的,需要一个边界条件(最短序列中,包含首尾的珠子的颜色的个数一定是1)。例如:赤橙黄绿青蓝紫,就是最短子串(首尾珠子的颜色赤、紫,该序列包含赤、紫颜色的珠子各1个),而 赤橙黄绿赤青蓝紫 一定不是最短子串(因为首位的珠子是赤色,而包含赤色的珠子共两颗,因此,最短子串是 橙黄绿赤青蓝紫)。
边界条件,证明如下(反证法):假设存在反例,子串中包含首位珠子颜色的珠子的数量大于1,那么我们将首位指针向后移动1,此时,新子串中,必定包含原首位颜色的珠子而且子串长度,变小,因此,新子串要比旧子串更符合条件,出现矛盾,因此原结论是正确的。
参考代码(感觉网上的代码很长,而且较难理解,自己写了一发,不保证鲁棒性,仅仅用于参考):
bool judgeColors(