最小覆蓋子串
給你乙個字串 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 中存在這樣的子串,我們保證它是唯一的答案。思路 參考大佬的解題思路,超級清晰 ...