String 查找包含另一个字符串作为子序列的最小子字符串的长度
假设我有一个字符串String 查找包含另一个字符串作为子序列的最小子字符串的长度,string,algorithm,data-structures,time-complexity,String,Algorithm,Data Structures,Time Complexity,假设我有一个字符串s1=“eabegcghdefgh”和另一个字符串s2=“egh” 代码应该返回答案4,因为s1的子字符串“efgh”(因为它是包含s2作为子序列的最小子字符串) 注意:可能有几个子字符串,但“efgh”是最小的子字符串 换句话说,查找s1的最小子字符串的长度,该子字符串包含另一个字符串s2的所有字符,但顺序为 请注意:我想问一下如何在O(n)时间复杂度下实现这一点。这是一个基本的滑动窗口问题,通常被称为“一个字符串中包含另一个字符串的所有字符的最小窗口”。我们通过从要搜索的字
s1=“eabegcghdefgh”
和另一个字符串s2=“egh”
代码应该返回答案4,因为s1
的子字符串“efgh”
(因为它是包含s2
作为子序列的最小子字符串)
注意:可能有几个子字符串,但“efgh”
是最小的子字符串
换句话说,查找s1
的最小子字符串的长度,该子字符串包含另一个字符串s2
的所有字符,但顺序为
请注意:我想问一下如何在O(n)时间复杂度下实现这一点。这是一个基本的滑动窗口问题,通常被称为“一个字符串中包含另一个字符串的所有字符的最小窗口”。我们通过从要搜索的字符串的第一个索引开始使用两个指针“low”和“high”来解决这个问题,我们增加high指针,直到模式的所有字符都匹配为止,然后通过增加low指针来缩小子字符串 下面是解决这个问题的java代码片段
public static String smallestWindow(String s, String pat){
if(s == null || s.length() == 0)return "-1";
int map[] = new int[128];
for(char k : pat.toCharArray())
map[k]++;
int count =0,start=-1,end=-1,lo=0,hi=0,min= Integer.MAX_VALUE;
for(hi = 0;hi<s.length();hi++)
{
if(map[s.charAt(hi)] >0)
count++;
map[s.charAt(hi)]--;
if(count == pat.length())
{
while(lo<hi && map[s.charAt(lo)] <0)
{ map[s.charAt(lo)]++;
lo++;
}
if(min > hi - lo +1)
{
min = hi - lo+1;
start = lo;
end = hi+1;
}
map[s.charAt(lo)]++;
lo++;
count--;
}
}
return start == -1? "-1" : s.substring(start,end);
}
publicstaticstringsmallest窗口(strings,stringpat){
如果(s==null | | s.length()==0)返回“-1”;
int map[]=新int[128];
for(chark:pat.toCharArray())
映射[k]++;
int count=0,start=-1,end=-1,lo=0,hi=0,min=Integer.MAX\u值;
用于(hi=0;hi0)
计数++;
地图[s.charAt(hi)]--;
if(count==pat.length())
{
while(lonice)问题。到目前为止你尝试了什么?O(n)可能需要一些复杂的簿记。我会调查一些类似的事情:扔掉所有没有(或不能)的字符扮演一个角色,然后搜索字符串的所有匹配项。如果你记住了字符的原始位置,你就知道长度。但这很棘手。问题不一样,一个包含另一个字符串的所有字符的字符串并不意味着另一个字符串是第一个字符串的子序列。