最后更新
一刷
08-Jan-2017
昨天Amazon group面結束,剛回家。
國內以前喜歡的女生結婚了,嘿嘿...好開心呀~~
這次面試感覺自己的做法完爆別人,比什么2 greedy好多了= = 總之表現比想象的好,最后一面的面試官真是聰明得一逼,我的思路稍微說她就明白,跪了,這也太出色了。 我只能說A家對于背題黨直接OA拿VIDEO或者OFFER確實水,但是有實力的也有,比如給我面試的這個印度姐姐,屌屌屌。
總之希望自己能過能過。
開始準備Google吧。
言歸正傳。
一長一短2個String
在長的String里找最短的substring,使得substring包含所有短string的字符。
('a'在短字符串里出現2次,substring里也要出現2次才行)
2 pointers來做的,固定左邊,右邊往右找,直到substring滿足要求。 在往右的過程中,我們可能添加了很多不必要元素:
要滿足abc
我們在ab baba cba里找,找到C的時候,添加了baba這段沒用的,這個時候嘗試左邊縮進。
比較通過2個int[256],一個是需要的字符數,一個是現有的。
Time: O(n)
Space: O(1)
public class Solution {public String minWindow(String s, String t) {if (s.length() < t.length()) return "";int[] need = new int[256];int[] count = new int[256];for (char c : t.toCharArray()) {need[c]++;}int right = 0;String res = "";int minLength = Integer.MAX_VALUE;for (int left = 0; left < s.length(); left++) {while (right < s.length() && !contains(need, count)) {count[s.charAt(right++)] ++;}if (right - left < minLength && contains(need, count)) {minLength = right - left;res = s.substring(left, right);}count[s.charAt(left)] --;}return res;}public boolean contains(int[] need, int[] count) {for (int i = 0; i < 256; i++) {if (need[i] > count[i]) {return false;}}return true;}
}
方法二:
也是2 pointers,和一的做法差不多,唯一不同的就是判斷是否包含的方法。
方法一是通過比較int[256]來判斷是否包含所有character,這里有個別的方法。
比如短string是abcde,那么總共需要5個字符才能滿足。但也不是隨便5個字符就能滿足,只有某些字符才能滿足。
比如:
一開始是abcde,需要5個才能滿足,而a,b,c,d,e其中任何一個都是有效字符。
假如我們substring中已經有了a和c,需要bde,此時的有效字符就變成了b,d,e,讀到b,d,e才可以讓需要數字++
同理,縮進也要判斷,比如substring里有3個A,縮進最左邊縮小了1個A,那么當前需要的元素數量是不變的,因為我們還有2個A可以使用,相反如果縮掉了B,而我們substring里沒有B了,總共需要的元素數量就要++
if (--chars[s.charAt(right++)] >= 0) {validRead ++;}
這個說的是,substring讀取一個,然后判斷是否是有效讀取,把那些-- ++之類的給展開就一目了然了,后面的+ + --一樣 ,展開再看。
public class Solution {public String minWindow(String s, String t) {if (s.length() == 0 || s.length() < t.length()) return "";String res = "";int minLength = Integer.MAX_VALUE;int[] chars = new int[256];for (char c : t.toCharArray()) {chars[c] ++;}int need = t.length();int validRead = 0;int right = 0;for (int left = 0; left < s.length(); left ++) {while (right < s.length() && validRead < need) {if (--chars[s.charAt(right++)] >= 0) {validRead ++;}}if (validRead >= need && right - left < minLength) {minLength = right - left;res = s.substring(left, right);}if (++chars[s.charAt(left)] > 0) validRead --; }return res;}
}
方法二是因為后面的題要用到這個辦法。