日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

76. Minimum Window Substring

發布時間:2023/11/30 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 76. Minimum Window Substring 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最后更新

一刷
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;} }

方法二是因為后面的題要用到這個辦法。

轉載于:https://www.cnblogs.com/reboot329/p/6263861.html

總結

以上是生活随笔為你收集整理的76. Minimum Window Substring的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。