无重复字符的最长子串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
上链接为Leecode上题目链接
上为题目描述
当然 题目有很多方法 我的方法也肯定不是最好的。
废话少说 上解析
简而言之 动态规划 (可以去参考一下 我主页上的最长递增子序列 和最大子序列的解析 和我要讲的方法有很高的相似度)
此为链接
https://www.baidu.com/link?url=mwEtEZMysBq4LqbQlovhEYtTpNwqK6BLzH1cXVePyzzXRdD9qwP1-3CYtWqCBkZn5ln0CD3F0u8IaLjr-TyCE_&wd=&eqid=b3213c950033bbf9000000035eb4b124
好了我们切入正题
先考虑特例 (我在提交的时候也踩了特例的坑)
1:长度为0的时候直接返回就行了
2:长度为1 直接返回一就OK了
此时建立在长度大于1的情况
我们有一个Max存储最大长度
一个max1记录以最后一个字符为结尾的最长无重复字符最长子串
其实 动态规划就是考虑 长度由 n 变为n+1 时 对我们所要求的数据所造成的变化 然后n+1变为 n+2
现在回到我们这个题目上
我们已经有长度为n时的Max 和max1
现在我们的长度变为n+1 我们要做怎样的处理呢
我们用第n+1个字符与它前面的max1个字符依次比较
会有两种情况
(1)无重复 那么max1加一
(2)有重复 我们在找到重复是就停止本轮的后续比较 对max1进行更新 打比方往前面比较了3个发现n-2 和 n+1 是同一个字符 那么 max1就要重新赋值 为3
OK 我们两个情况都处理好之后
我们我判断max1 和Max的关系
判断 我们的最终结果是否需要进行更新
这样我们最后就能得到该字符串的最长无重复字符子串
下面我们看代码
package leecode; class Solution { public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray();//Converts to an array of characters int i; int Max = 1;//The final result int max1 = 1;//Ends with the last character if (chars.length == 0) {//Special case 1 return 0; } if (chars.length == 1) {//Special case 2 return 1; } for (i = 1; i < chars.length; i++) {//Dynamic programming int k = i - max1; for (int j = i - 1; j >= k; j--) { if (chars[i] == chars[j]) {//Find the same update pop up max1 = i - j; break; } if (j == i - max1) {//update max1++; } } if (max1 > Max) {//Whether or not to update Max = max1; } } return Max; } }
OK