题目:
给定一个字符串及一个字符串集合A,求该字符串中包含A中所有字符的最短子串长度。
解决方案一:
最直接的方法就是,直接开始遍历:查找任意两个子串之间是否包含str2,如果包含,记录下长度,求得最小值即可。
str1 = "daebfacba";
str2 = "abc";
minLen = len(str1);
for i = 0:len(str1)
for j = i+1:len(str1)
if (isContainAllElements(str1,str2,i,j)) //如果i到j的子串包含所有字符,则记录长度
if j-i < minLen
minLen = j-i;
考虑isContainAllElements(),复杂度为O(n3)。
解决方案二:
为str2中的每一个字符设置一个变量,用来存储最新的在str1中出现的位置。用H(x)来表示该数值。
以“daebfacba”为例,
1. 扫描到第一个a时,H(a)=1; H(b),H(c)无值;
2. 扫描到第一个b时,H(a)=1; H(b)= 3,H(c)无值;
3.扫描到第二个a时,由于C还无值,因此,直接覆盖a的值:H(a)=5; H(b)=3,H(c)无值;
4. 扫描到第一个c时,H(a)=5; H(b)&#