思路:
1. 用一个int[26]的数组记录信息,出现过则索引为c-'a'的那一项置为1;
错误:(1)并不是只有a-z,(2)同2的错误,但可以改为置为index。
2. 用一个set<Character>装出现过的字符,如果遇到重复的就clear set,并维护一个max表示最大长度
错误:不能直接clear set,因为之前的字符是部分有用的,例如:dvdf
3. 用一个map<Character,Integer>(value是在char[]中的index)来装出现过的字符,遇到重复的就删除<=重复字符index的元素,
错误:map唯一的遍历方法是利用entrySet,但是只能读不能改,否则会有同步错误,因此“删除”指定index的元素无法实现。
4. 跟3类似,但是把删除改为clear map,然后重新插入index>重复元素index的所有元素然后接着遍历。
可以通过,但是复杂度是O(n^2),有点高
5.好的解法: 因为char转int后范围是0-255,因此可以声明一个int[256]=rec,全部初始化为-1,存char在char[](Str.toCharArray())中的索引,然后维护两个指针,l和r,先r++,遇到重复的就右移l到重复点,并把遍历到的字符对应的rec中的位置置为-1,重复直到结尾。
复杂度:O(n^2)
易错点:49行,即最后一次遍历的结果不能忘