最小覆蓋子串

2021-10-11 15:51:06 字數 2111 閱讀 1500

最小覆蓋子串

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字元的最小子串。

示例:

輸入: s= "adobecodebanc",t= "abc"輸出:"banc"

說明:

方法一:暴力(超時)

列舉s所有的子串,統計字元的頻數看是否符合條件

public string minwindow(string s, string t) 

for (int start = 0; start <= s.length() - t.length(); start++)

int smap = new int[128];

for (int i = start; i <= end; i++)

boolean flag = true;

for (int i = 0; i < t.length(); i++)

}if (flag) }}

return ans;

}

時間複雜度o(s3+t)

小優化:直接在迴圈中統計頻數

public string minwindow(string s, string t) 

for (int start = 0; start <= s.length() - t.length(); start++)

for (end = start + t.length() - 1; end < s.length(); end++)

smap[s.charat(end)]++;

boolean flag = true;

for (int i = 0; i < t.length(); i++)

}if (flag) }}

return ans;

}

方法二:滑動視窗

滑動視窗中的都是滿足條件的,移動左邊界找到最小的子串

public string minwindow(string s, string t) 

int left = 0;

int right = 0;

int distance = 0;//滑動視窗中包含t中字元的個數,不重複計算

while (right < s.length())

if (smap[rightchar] < tmap[rightchar])

smap[rightchar]++;

right++;

while (distance == t.length())

char leftchar = s.charat(left);

if (tmap[leftchar] == 0)

if (smap[leftchar] == tmap[leftchar])

smap[leftchar]--;

left++;}}

return ans;

}

時間複雜度o(s+t):右邊界s,最壞情況下左邊界s-t

不用存s的頻數

public string minwindow(string s, string t) 

int left = 0;

int right = 0;

int distance = t.length();//滑動視窗中包含還差t中字元的個數

while (right < s.length())

tmap[rightchar]--;

right++;

while (distance == 0)

char leftchar = s.charat(left);

if (tmap[leftchar] == 0)

tmap[leftchar]++;

left++;}}

return ans;

}

最小覆蓋子串

給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。滑動視窗。設定left,right兩個游標...

最小覆蓋子串

描述 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。實現 class solution ...

最小覆蓋子串

題目 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。思路 參考大佬的解題思路,超級清晰 ...