public static void main(String[] args) { int ret = commpareStr("abc", "12345cab"); System.out.println(ret); } //orgStr源字段 public static int commpareStr(String tarskStr, String orgStr) { // String tarskStr="acabb"; char tar[] = tarskStr.toCharArray(); int count[] = new int[256]; for (int i = 0; i < tar.length; i++) { count[tar[i]]++; } //count[a]=2 count[c]=1 count[b]=2 //定义一个目标窗口和目标字符串一样大小 以及是否找到了同源异构的flag,flag=0代表找到了,flag=整数则表示多余字符,为负数,则缺少字符 //什么叫欠债表呢 //从源来字符串里从头遍历,如果一个字符串出现在欠债表里,则欠债表里的相应字符串的个数减一,如果个数小于0,则flag-- //当第一次遍历完窗口[0...M-1]的大小的数据后,下一个窗口遍历是[1...M], //这是需要处理逻辑和第一次遍历窗口的逻辑不一样 //第二次以及以后窗口向左边移动的时候,如果进入窗口的字符,如果在欠债表里已经<=0,那么flag++,且欠债表里的相应字符串的个数减一 //从左边出去的窗口数据[R-M] 以及<0,则flag--,则欠债表里响应字符串的个数+1 //进入窗口的字符,在欠债表里个数-1,出去窗口的字符,在欠债表里个数+1(ps:还给欠债表) // commpareStr("abc","12345cad"); int M = tarskStr.length(); char org[] = orgStr.toCharArray(); int R = 0; int flag = 0; for (; R < M; R++) { System.out.println(org[R] + "=" + count[org[R]]); if ((count[org[R]] = count[org[R]] - 1) < 0) {//在-1之前已经是0了,如果再次-1必然是负数,flag+1(我欠表里字符一个) flag++; } } for (; R < org.length; R++) { if (flag == 0)//直接找到同源异构词 return R - M; if ((count[org[R]] = count[org[R]] - 1) < 0) { flag++; } if (count[org[R - M]]++ < 0) { flag--; } } return flag == 0 ? R - M : -1; }