题目1

  1. 给定长度为m的字符串aim,以及一个长度为n的字符串str
  2. 问能否在str中找到一个长度为m的连续子串,使得这个子串刚好由aimm
  3. 字符组成,顺序无所谓,返回任意满足条件的一个子串的起始位置,未找到返回-1
  1. /*
  2. */
  3. public static int slidingWindow1(String aim, String str){
  4. if(str.length()<=0 || aim.length()<=0 || str.length()<aim.length()){
  5. return -1;
  6. }
  7. char[] aimChars = aim.toCharArray();
  8. //定义一个欠债表
  9. int[] count = new int[256];
  10. for (int i = 0; i <aimChars.length; i++) {
  11. count[aimChars[i]]++;
  12. }
  13. System.out.println(Arrays.toString(count));
  14. int R = 0;
  15. int invalid = 0;
  16. char[] strChars = str.toCharArray();
  17. //定义一个窗口,大小为aim.length
  18. int M = aimChars.length;
  19. //先让窗口有M个字符
  20. for (; R <M; R++){
  21. if(count[strChars[R]]--<=0){
  22. invalid++;
  23. }
  24. }
  25. //滑完第一个窗口,先判断是否存在同源异构词
  26. //第一次形成长度为M的窗口,继续往后滑
  27. for (;R<str.length();R++){
  28. if(invalid == 0){
  29. return R-M;
  30. }
  31. if(count[strChars[R]]-- <=0){
  32. invalid++;
  33. }
  34. //把窗口外的字符去除,再次欠债
  35. if(count[strChars[R-M]]++ <0){
  36. invalid--;
  37. }
  38. }
  39. return invalid==0?R-M: -1;
  40. }
  41. public static void main(String[] args) {
  42. String aim = "abcd";
  43. String str = "ifadkfgabdc";
  44. System.out.println(slidingWindow1(aim, str));
  45. }