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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java最小子串覆盖_Java 算法-最小子串覆盖

發布時間:2024/2/28 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 算法-最小子串覆盖的全部內容,希望文章能夠幫你解決所遇到的問題。

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