n个珠子m种颜色,包含全部m种颜色的最短子串长度

百度一道面试题:

有一串珠子首尾不相连,总共N个,这些珠子总共有M种颜色,在这串珠子里面找到最短的连续珠子子串,使子串出现所有的M种颜色。
毫无疑问,这个可以用暴力破解,N^2 时间效率可以解决,面试官百分之一千会让你优化。

思路:两个指针分别表示最短包含m种颜色珠子的最短子串的首尾,这个很容易想到,但是要考虑清楚边界条件,为什么说这个子串是最短的,需要一个边界条件(最短序列中,包含首尾的珠子的颜色的个数一定是1)。例如:赤橙黄绿青蓝紫,就是最短子串(首尾珠子的颜色赤、紫,该序列包含赤、紫颜色的珠子各1个),而 赤橙黄绿赤青蓝紫 一定不是最短子串(因为首位的珠子是赤色,而包含赤色的珠子共两颗,因此,最短子串是 橙黄绿赤青蓝紫)。

边界条件,证明如下(反证法):假设存在反例,子串中包含首位珠子颜色的珠子的数量大于1,那么我们将首位指针向后移动1,此时,新子串中,必定包含原首位颜色的珠子而且子串长度,变小,因此,新子串要比旧子串更符合条件,出现矛盾,因此原结论是正确的。

参考代码(感觉网上的代码很长,而且较难理解,自己写了一发,不保证鲁棒性,仅仅用于参考):

bool judgeColors(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值