More:【目錄】LeetCode Java實現html
Given a string S, find the length of the longest substring T that contains at most two distinct characters.
For example,
Given S = 「eceba」,
T is "ece" which its length is 3.java
方法一:假設有一個滑動窗口,窗口左右兩邊的下標分別記爲left和right。遍歷字符串,依次肯定left和right。具體實現見代碼(稍微難理解一點)post
方法二:仍是引入一個滑動窗口,窗口左右兩邊的下標分別記爲left和right。再引入一個numDistinct變量,用於記錄窗口中已經出現的不一樣字符次數。此外,使用一個int[258]來模擬哈希表,記錄每一個字符出現的次數count。ui
遍歷字符串(right右移),當遇到的字符出現次數爲0時,numDistinct++; 當numDistinct的次數超過2時,說明left須要往右移,在left往右移的過程當中,減小所指字符的count,最終使得numDistinct=2,才暫停left的右移。指針
方法二容易理解,且能夠用於求解k個不一樣字符組成的最長子字符。下面代碼中方法二就是實現k個不一樣字符的狀況。htm
//Method1: Longest Substring with At Most Two Distinct Characters public static int lengthOfLongestSubstringTwoDistinct1(String s) { if(s==null || s.length()<=0) return 0; int left=0; int right=-1; int maxLen=0; for(int i=1;i<s.length();i++) { if(s.charAt(i)==s.charAt(i-1)) continue; if(right!=-1 && s.charAt(i)!=s.charAt(right)) { maxLen=Math.max(maxLen, i-left); left=right+1; } right=i-1; } return Math.max(s.length()-left,maxLen); } //Method2: Longest Substring with At Most k Distinct Characters public static int lengthOfLongestSubstringTwoDistinct2(String s,int k) { if(s==null || s.length()<=0) return 0; int[] count=new int[256]; int numDistinct=0; int maxLen=0; int left=0; for(int right=0;right<s.length();right++) { if(count[s.charAt(right)]==0) numDistinct++; count[s.charAt(right)]++; while(numDistinct>k) { count[s.charAt(left)]--; if(count[s.charAt(left)]==0) numDistinct--; left++; } maxLen=Math.max(maxLen, right-left+1); } return maxLen; }
Time complexity : O(n)blog
Space complexity : O(1)ip
1. 方法一中,i可能會越界,因此代碼第16行別忘記了s.length()-left。字符串
2. 方法一里的left,right以及 i指針之間的關係要搞清楚。get
3.方法二中引入了numDistinct,很是方便,有時候每每多設置一個變量,就能實現所須要的功能
More:【目錄】LeetCode Java實現