无重复字符的最长子串

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

 

posted @ 2020-05-09 14:01  Mr小明同学  阅读(362)  评论(0编辑  收藏  举报