![1f16184ec818c20d119af8616769a181.png](https://i-blog.csdnimg.cn/blog_migrate/052175b5c8b46878435317a97ff160a4.jpeg)
题目描述
原创作者:bigsai,长期维护不易,如有收获还请点赞、收藏支持!
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
分析
此题就是给一个字符串让你找出最长没有重复的一个字串。 要搞清子串和子序列的区别:
- 子串:是连续的,可以看成原串的一部分截取。
- 子序列:不一定是连续的,但是要保证各个元素之间相对位置不变。
处理思路?
- 暴力查找,暴力查找当然是可以的,但是复杂度过高这里就不进行讲解了。
本题选择的思路是滑动窗口,滑动窗口,就是用一个区间从左往右,右侧先进行试探,找到区间无重复最大值,当有重复时左侧再往右侧移动一直到没重复,然后重复进行。在整个过程中找到最大的那个空间返回即可。
但是在Java编程语言中如何操作呢?
- 定义一个left和right,表示滑动的区间。初始均为0.定义一个max表示最长初始为0.
![2a91676b444c6f8c77881ecac514ec29.png](https://i-blog.csdnimg.cn/blog_migrate/2cdcf0a09d05a1424efbd4d05ab0883a.jpeg)
- right往右移动,同时记录移动经过元素的个数。当遇到重复即存在该元素的时候暂停。比较这个长度(right-left+1)与max的大小,max是否需要更新。
![b50cae88ed64ebfcbbeaa17b0b2e8c45.png](https://i-blog.csdnimg.cn/blog_migrate/5d7d30adb760f6de832636eb75e60910.jpeg)
- 接着left往右移动,同时移动途中将出现字母的词数减一。直到移动到right位置相同字母的右侧说明当前窗口没有重复序列了,继续循环执行到结束。
![b212c290355b8934270cc2108b836af5.png](https://i-blog.csdnimg.cn/blog_migrate/2adf6c2e78135345c9ad3cb4fb8b24e3.jpeg)
当然,最长的情况也在其中,因为我们只要不重复right就会右移,不能移的时候前一个即可能是最大长度:
![250580a4019b53e733fbc4522063da41.png](https://i-blog.csdnimg.cn/blog_migrate/bfbfd50d5a95425d9320a8c80dfad1a8.jpeg)
你可能会问,用什么存储这个词数呢?
- 哈希当然可以啦,你可以用HashMap存储记录这个值进行维护,就是可能偶尔稍微麻烦一点。
因为咱们知道字符char它底层是一个ASCII,是一个数值,我们可以创建一个int数组直接把ASCII值作为数组对应下表进行处理,这样虽然占了点内存但是使用起来方便很多。
ac代码
附上ac 代码:
class Solution { public int lengthOfLongestSubstring(String s) { int a[]=new int[500]; int max=0; int l=0; for(int i=0;i1) { a[s.charAt(l++)]--; } if(i-l+1>max) max=i-l+1; } return max; }}
最后,欢迎关注、点赞、收藏给个支持吧!持续分享哦