java最小子串覆盖_Java 算法-最小子串覆盖
今天在lintCode上做了一道題,感覺有必要將它記錄下來。
1. 概覽
(1).題意
給定一個字符串source和一個目標字符串target,在字符串source中找到包括所有目標字符串字母的子串。
(2).注意事項
如果在source中沒有這樣的子串,返回"",如果有多個這樣的子串,返回長度最小的子串。(注意:lintCode上說的是起始位置最小,但是我認為它說錯了)。
(3).說明
在答案的子串中的字母在目標字符串中是否需要具有相同的順序?--不需要。
(4).樣例
給出source = "ADOBECODEBANC",target = "ABC" 滿足要求的解 "BANC"
2.解題思路
這道題的思路非常的簡單,就是哈希表的操作。
首先,我們創建一個哈希表,遍歷target字符串,更新每個字符的出現的次數;然后定義一個count變量,初始換為target字符串的長度。
其次,我們在遍歷source字符串,更新哈希表。
我知道,這樣說的話,肯定不好明白意思,接下來我貼代碼,然后再詳細的解釋。
3.代碼
public String minWindow(String source, String target) {
if (source.equals(target)) {
return target;
}
if (target.equals("") || source.equals("")) {
return "";
}
int [] map = new int[128];
int count = target.length();
int begin = 0;
int head = 0;
int end = 0;
int d = Integer.MAX_VALUE;
for (int i = 0; i < target.length(); i++) {
map[target.charAt(i)]++;
}
while (end < source.length()) {
if(map[source.charAt(end++)]-- > 0) {
count--;
}
while (count == 0) {
if (d > end - begin) {
d = end - begin;
head = begin;
}
if(map[source.charAt(begin++)]++ ==0) {
count++;
}
}
}
return d == Integer.MAX_VALUE ? "" : source.substring(head, head + d);
}
map[source.charAt(end++)]--就是用來更新我們的哈希表。但是這里為什么只有大于0時,count才減減?因為之后在大于0時,表示更新的字符才是target中的字符。
當count等于0時,source的begin~end的子串中含有全部target字符了。然后我們在更新head,如果d > end - end,head等于begin。
為什么map[source.charAt(begin++)]++ ==0時,count需要加加呢?因為在end ~ begin之間有可能出現了target的字符多次,我們需要更新begin,來調整距離,使得距離最小。
總結
以上是生活随笔為你收集整理的java最小子串覆盖_Java 算法-最小子串覆盖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java将map置空_Java实现过滤掉
- 下一篇: java美元兑换,(Java实现) 美元