字符串查找类
主要用于在字符串中查找子串。模板比较灵活,可根据情况修改返回类型。
/**
* @param s 字符串
* @param t 子字符串
* @return String
*/
public String window(String s, String t) {
if(s == null || s.length() == 0 || t == null || t.length() == 0) {
return "";
}
// step 1: 创建ACSSII数组表用于查询
int[] dict = new int[128];
// step 2: 将子字符放入查询数组中
for (int i=0; i<t.length(); i++) {
dict[t.charAt(i)]++;
}
// step 3: 定义left: 左边界,right: 右边界,start: 最小子串开始索引,len: 窗口大小,count:当前还需要的字符串
int left = 0, right = 0, start = 0, len = Integer.MAX_VALUE, count = t.length();
// step 4: 遍历
while(right < s.length()) {
char c = s.charAt(right);
// 判断: dict[c-'A']>0证明这个字符在目标字符串中
if (dict[c] > 0) {
count--;
}
// 非目标字符经过一下运算后就是负数
dict[c]--;
// step 5: 用count判断是否包含所有字符串,若等于0的时候说明left~right之间已经有符合条件的子串
if (count == 0) {
while (left < right && dict[s.charAt(left)] < 0) {
dict[s.charAt(left)]++;
left++;
}
// step 6: 更新窗口
if (right - left + 1 < len) {
len = right - left + 1;
start = left;
}
// 记得将left调到下一个去
dict[s.charAt(left)]++;
left++;
count++;
}
right++;
}
return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
}