给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度
題目
給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串 的長度。
示例 1:
輸入: s = “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。 示例 2:
輸入: s = “bbbbb” 輸出: 1 解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。 示例 3:
輸入: s = “pwwkew” 輸出: 3 解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。 示例 4:
輸入: s = “” 輸出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、數字、符號和空格組成
思考
首先我們考慮就是通過一個集合存放遍歷的字符,第一次發現有重復的字符標記一下集合中存放重復字符的位置。賦值給臨時變量temp。后面遍歷的時候比較臨時變量和當前重復字符的位置大小區最大值。可能文案不好理解 舉個例子:
比如: abcabwert
第一次重復出現是a 位置是1 第二次出現重復是b 這時候temp 就應該是2 因為b 的位置大于第一次a 的位置。后面這個abwert 沒有重復了 按照正常邏輯算長度就是 遍歷的長度 i + 1 - temp 就是當前遍歷目前最長無重復字符串長度。因為他是遍歷目前 所以也得給他放到一個臨時變量中index。也是每次遍歷取最大值。根據這個思路可以得出如下第一種算法。
不管哪種算法思路和上面是如出一轍。比如使用第二種算法,沒有使用集合存放元素它使用的是assic碼 因為上面有一句提示 s 由英文字母、數字、符號和空格組成 可以得出他們所有字符的assic 0-127 所以可以使用一個int[] s = new int[128] 來存放每個字符 值為他們的下標+1 位置。
疑問:為啥要加+1
解答: 是因為我們相同的時候返回1 為了統一處理都加1 不用單獨處理。比如:bbb 不使用下標+1 返回就是0 ,使用+1 就是1 。
算法
第一種
/*** 利用hashMap 存放字符 當存在的時候:最終得到最后一個相同字符的下標位置+1** @param s* @return*/public static int lengthOfLongestSubstring(String s) {int length = s.length();int temp = 0;int index = 0;Map<Character, Integer> characterIntegerMap = new HashMap<>(length);for (int i = 0; i < length; i++) {char c = s.charAt(i);if (characterIntegerMap.containsKey(c)) {// 最終得到相同字符的下標最大差值temp = Math.max(characterIntegerMap.get(c), temp);}characterIntegerMap.put(c, i + 1);// 最終得到最長無重復字符串長度: 存在符合要求的的字符串長度 和 最新遍歷無重復長度 求最大值index = Math.max(index, i + 1 - temp);}return index;}第二種
/*** 使用char assic 和 int 映射 實現相同字符的下標替換: char的assic值 作為 數組的下標 , char 在字符串中下標+1 作為數組的對應的值** @param s* @return*/public static int lengthOfLongestSubstringV2(String s) {int[] arras = new int[128];int length = s.length();int index = 0;int temp = 0;for (int i = 0; i < length; i++) {// 最終得到最后一個相同字符的下標位置+1temp = Math.max(temp, arras[s.charAt(i)]);// 最終得到最長無重復字符串長度: 存在的字符串長度 和 最新遍歷無重復長度 求最大值index = Math.max(index, i + 1 - temp);arras[s.charAt(i)] = i + 1;}return index;}結果
總結
以上是生活随笔為你收集整理的给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 温度传感器100k 热水器温度探头
- 下一篇: html勾选标签,html怎么勾选框