3*(4+0)&amp#178;=?数学题这题怎么做?

要求最长不重复子字符串而不是孓序列

最先想到的就是暴力解法就是将所以长度大于2的子字符串都检测一遍,在对每个子字符串检测时需要一个数据结构来存储字符絀现的信息,并且当某个子串出现重复时后续包含该子串的字符串就不需要检查了。上代码;

 
暴力解法的思想十分朴素直接但是执行效率較低还好AC了。
 
思路一的子串检查是存在大量重复的可以使用滑动窗口法。滑动窗口是一种常用于数组和字符串算法问题的抽象概念滑动窗口是由 来限定,字符串检查重复可以使用HashSet
 
 
思路二中滑动窗口左侧i在每次j遇到重复只是向后移动一格,移动后的while检查和ret=Math.max(ret,j-i+1)这一步存在冗余可以直接跳到下一个s[i]出现位置下一个位置上
 
 
因为字符集是ASCII集合,数量十分有限所以采用思路一里面的检查子串重复的记录表的方法,index数组记录下一个s[i]出现的位置索引的下一个位置这个方法是看的Solutions里面的解答,感觉吸收结合了思路一和思路三在存储和搜索上的优勢达到了效率的最大化。
我们以小写字母表为例手动运行代码感受一下其中的奥妙:以字符串“pwwkew”为例子:


我要回帖

更多关于 AMP 的文章

 

随机推荐