我们必须找到包含另一个字符串的一些字谜作为子序列的字符串的子字符串的数量。
仅当开始或结束位置不同时,子字符串才被认为是不同的。
String="aba"
anotherString="a"
Occurence of "a" in "aba" is as follows :
a at index 0..0
ab at index 0..1
aba at index 0..2
ba at index 1..2
a at index 2..2
i.e total of 5 times...so o/p=5
(the start and end points here, are inclusive)
我认为这个问题是“字符串中子序列的出现次数”和“在包含另一个字符串的所有字符的字符串中查找最小窗口”的应用之一。
但即使在组合代码中进行了多次更改后,我也无法提出解决方案。粘贴我的代码是没有用的,因为我知道我错了。我想知道的是我们如何在没有暴力解决方案的情况下有效地解决这个问题。
代码 :
public static void findLengthAndSequence(String str1,String str2){
int begin=0,biginWith=0,endWith=0,count=0,minLen=Integer.MAX_VALUE,len=0;
int l=0;
int [] hasFound=new int[256];
int [] toFound=new int[256];
for(int i=0;i<str2.length();++i){
toFound[(int)str2.charAt(i)]++;
}
for(int end=0;end<str1.length();++end){
if(toFound[(int)str1.charAt(end)]==0)
continue;
hasFound[(int)str1.charAt(end)]++;
if(hasFound[(int)str1.charAt(end)]<=toFound[(int)str1.charAt(end)]){
count++;
}
if(count==str2.length()){
l++; //add this to find number of such anagram in string
System.out.println("l= "+l+" "+begin+" "+end);
while(toFound[(int)str1.charAt(begin)]==0 || hasFound[(int)str1.charAt(begin)]>toFound[(int)str1.charAt(begin)] )
{
if(hasFound[(int)str1.charAt(begin)]>toFound[(int)str1.charAt(begin)]){
hasFound[(int)str1.charAt(begin)]-=1;
}
begin++;
}//while
len=end-begin+1;
if(minLen>len){
minLen=len;
endWith=end;
biginWith=begin;
}
}//if
}//end
for(int i=biginWith;i<=endWith;++i){
System.out.print(""+str1.charAt(i));
}
}
此代码为上述问题提供输出=3。我知道一旦到达第一个字符串的末尾,我就无法检查其中的每个子字符串。
e.g in "aba" my code checks for a,ab,aba.but once I reach the end it will not check
ba,a .since we need to count this also as they are having different index values.
除了指数时间复杂度的蛮力检查每个可能的子字符串之外,还有其他方法吗?