// 在一个字符串中找出包含特定字符串的最小窗口.cpp : Defines the entry point for the console application.
//
同时请产考这个链接 http://blog.csdn.net/yuucyf/article/details/6714235
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
void FMW(char String[], char Sample[], int &startPos, int &endPos)
{
char hashSample[256] = {0};
char hashString[256] = {0};
int lenString = strlen(String);
int lenSample = strlen(Sample);
int curFront = -1;
int curRear = -1;
int minFront = -1;
int minRear = -1;
int minLen = lenString;
int count = 0;
for (int i = 0; i < lenSample; i++)
{
hashSample[Sample[i]]++;
}
for (int j = 0; j < lenString; j++)
{
if (hashSample[String[j]] > 0)
{
hashString[String[j]]++;
if (curFront == -1)
{
curFront = curRear = j;
}
else
{
curRear = j;
}
if (hashString[String[j]] <= hashSample[String[j]])
count++;
if (count == lenSample) //当count == lenSample时,所有sample里的字符都已经match,但是hashString中的某个字符可能比hashSample中的要多
{
while (curFront <= curRear)
{
if (hashSample[String[curFront]] > 0)
{
if (--hashString[String[curFront]] < hashSample[String[curFront]]) //如果hashString中的某个字符比hashSample中的要多,仅仅是--,并不进行操作
{
if (curRear - curFront + 1 <= minLen)
{
minFront = curFront;
minRear = curRear;
minLen = minRear - minFront + 1;
}
count--;
curFront++;
break;
}
}
curFront++;
}
}
}
}
startPos = minFront;
endPos = minRear;
}
void printString(char str[], int startPos, int endPos)
{
if (startPos > endPos)
return;
if (endPos > strlen(str)-1)
return;
for (int i = startPos; i <= endPos; i++)
{
printf("%c ", str[i]);
}
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
char string[] = {"KAABKGUOUICHGACiIAB8FKCDBA"};
char sample[] = {"i"};
int startPos = 0;
int endPos = 0;
FMW(string, sample, startPos, endPos);
printString(string, startPos, endPos);
return 0;
}