滑動窗口算法能夠用以解決數組/字符串的子元素問題,它能夠將嵌套的循環問題,轉換爲單循環問題,下降時間複雜度。java
給定一個字符串,請你找出其中不含有重複字符的最長子串的長度。算法
輸入: s = "abcabcbb"
輸出: 3
解釋: 由於無重複字符的最長子串是 "abc",因此其長度爲 3。數組
經過不斷滑動窗口的大小,判斷窗口中元素是否相同,從而解決問題。優化
這個思路其實也不難,第 2 步至關於在尋找一個「可行解」,而後第 3 步在優化這個「可行解」,最終找到最優解。左右指針輪流前進,窗口大小增增減減,窗口不斷向右滑動。指針
更多解法能夠參考 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/code
class Solution { public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } if (s.length() == 1) { return 1; } if (s.length() == 2) { if(s.charAt(0) != s.charAt(1)) { return 2; } return 1; } int max = 1; int left = 0; int length = s.length(); while (left < length-1) { // 小優化,已經能夠不須要再進行下去了 if (length - left < max) { break; } for (int right=left+1; right<length; right++) { if (!check(s, left, right)) { if (right - left > max) { max = right - left; } break; } // 最後一個了,前面還沒被攔截下來,這裏要作最終計算了 if (right == length - 1) { if (right - left + 1 > max) { max = right - left + 1; } } } left ++; } return max; } // 是否知足要求的子串,沒有重複的 public boolean check(String s, int left, int right) { for (int i = left; i<=right-1; i++) { if (s.charAt(right) == s.charAt(i)) { return false; } } return true; } }