题目1
给定长度为m的字符串aim,以及一个长度为n的字符串str, 问能否在str中找到一个长度为m的连续子串,使得这个子串刚好由aim的m个 字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1
/* */ public static int slidingWindow1(String aim, String str){ if(str.length()<=0 || aim.length()<=0 || str.length()<aim.length()){ return -1; } char[] aimChars = aim.toCharArray(); //定义一个欠债表 int[] count = new int[256]; for (int i = 0; i <aimChars.length; i++) { count[aimChars[i]]++; } System.out.println(Arrays.toString(count)); int R = 0; int invalid = 0; char[] strChars = str.toCharArray(); //定义一个窗口,大小为aim.length int M = aimChars.length; //先让窗口有M个字符 for (; R <M; R++){ if(count[strChars[R]]--<=0){ invalid++; } } //滑完第一个窗口,先判断是否存在同源异构词 //第一次形成长度为M的窗口,继续往后滑 for (;R<str.length();R++){ if(invalid == 0){ return R-M; } if(count[strChars[R]]-- <=0){ invalid++; } //把窗口外的字符去除,再次欠债 if(count[strChars[R-M]]++ <0){ invalid--; } } return invalid==0?R-M: -1; } public static void main(String[] args) { String aim = "abcd"; String str = "ifadkfgabdc"; System.out.println(slidingWindow1(aim, str)); }