字符匹配:查找包含字符集的子串-和諧系統(tǒng)
[導(dǎo)讀]實(shí)現(xiàn)一個(gè)挺高級(jí)的字符匹配算法:
給一串很長(zhǎng)字符串,要求找到符合要求的字符串,例如目的串:123,1******3*****2,12******3這些都要找出來(lái)
其實(shí)就是一些和諧系統(tǒng)。。
與此題類(lèi)似:給
實(shí)現(xiàn)一個(gè)挺高級(jí)的字符匹配算法:
給一串很長(zhǎng)字符串,要求找到符合要求的字符串,例如目的串:123,1******3*****2,12******3這些都要找出來(lái)
其實(shí)就是一些和諧系統(tǒng)。。
與此題類(lèi)似:給一個(gè)很長(zhǎng)的字符串str, 還有一個(gè)字符集比如{a,b,c},找出str包含{a,b,c}的最短子串,要求O(n)。
/*
用兩個(gè)變量 front,rear 指向一個(gè)的子串區(qū)間的頭和尾(當(dāng)然,開(kāi)始時(shí)front和rear都指向字符串開(kāi)始處)。
用一個(gè)int cnt[255]={0}記錄當(dāng)前這個(gè)子串里字符集a,b,c各自的個(gè)數(shù),一個(gè)變量count記錄字符集里有多少個(gè)了
rear 一直加,更新cnt[]和count的值,直到count等于字符集個(gè)數(shù)
然后front++,直到cnt[]里某個(gè)字符個(gè)數(shù)為0(front 開(kāi)始的部分有可能和后面的重復(fù),所以front要加到某個(gè)字符個(gè)數(shù)為0),
這樣就找到一個(gè)符合條件的字串了,繼續(xù)下去,可以求出所有符合條件的串,同時(shí)可以求出滿足條件最短子串
*/
#include
using namespace std;
void MinSubString( char *src, char *des )
{
int min=1000;//找最短子串
int minfront=0;//最短子串開(kāi)始位置
int minrear=0;//最短子串結(jié)束位置
int front,rear;
front=rear=0;
int len=strlen(des);
int hashtable[255]={0};
int cnt[255]={0};
int cnt2[255]={0};
for(int i=0; i
