记录一下这道折腾了两天的题目:https://leetcode.com/problems/longest-substring-without-repeating-characters/
题意很简单,给一个字符串,求出它最长的无相同字符的子串。
首先试了试暴力搜索,遍历一次字符串,遍历过程中,对每个字符都有一个O(n^2)的处理时间,因为需要遍历该字符之后的字符串,对每个字符,需要和已有的子串相比较,如果不重复,则加入子串,不然就遍历下一个字符。加起来时间复杂度为O(n^3),然后,果然超时。。。
接下来换了一种思路,建立了一个map表,然后开始遍历字符串,对于一个新字符,如果它不在map表中,则加入map表,char对应那个字符,int对应所在位置,否则更新map表的int值为当前位置。而对于不重复子串,则求得一个子串起始位置,只要没遇到重复字符,起始位置就一直不变,遇到了,则先计算当前起始位置对应的最长不重复子串的长度,然后更新起始位置。
以上的思路都是对的,但接下来在“更新起始位置”这一细节方面居然整整WA了两次。。。
第一次就想着,每当遇到重复字符,就把起始位置更新为该字符上次出现的位置+1,然后就挂在“
abbba”这种类型的输入上。
第二次就改进,如果重复字符上次出现的位置,还在起始位置的前面,那么就不用考虑。这种思路是对的,只是当我写“不用考虑”这个处理分支时,忘记把当前子串长度+1了
都是悲剧。。。