在一个字符串中找出包含特定字符串的最小窗口

504 篇文章 0 订阅
// 在一个字符串中找出包含特定字符串的最小窗口.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值