5

题目

求一个字符串中最长的、不包含重复字符的子串。

比如 abcda ,答案可以是 abcd 或者 bcda

具体要求

一张纸、一支笔,手写。 (腾讯阿里的面试好像比较喜欢这类)

解题思路

可以先跟面试官确认,题中所指的字符是属于ascii字符。

具体的算法实现可以达到O(n)的复杂度,只需要建立一个队列,让字符串中的字符逐一入队,在每次入队的时候更新状态:如果该字符 c 没有出现在当前的队列中(可以用一个256的数组来标识),并根据需要更新当前最长字串的长度、起始位置;如果已经出现,则循环弹出之前入队的元素,直到弹出更早之前入队一个 c 为止。

实际上并不需要建立一个额外的队列,只需要一前一后两个指针,在字符串(即字符数组)中就能实现等同的效果。

附注

这种简单的题目,面试官要考察的除了设计简单的算法,另一个重点是代码变现能力;特别是直接在纸上写不便涂改,因此在下笔前务必要想清楚逻辑;同时还要注意代码风格。


felix021
13.4k 声望1.4k 粉丝

L'enfer, c'est l'autre.