首页 > 代码库 > [算法]求一段包含所有种类的字符子串

[算法]求一段包含所有种类的字符子串

 有一个字符串首尾相连(m个字符),有n种字符组成,求一段能使包含n种字符的子串,并使长短最短,时间复杂度要求O(n),空间复杂度O(1)

 

#include <cstring>int foo(const char* str, int m, int n){    int hit[256], count = 0, begin = 0, end, len = m;    memset(hit,0,256*4);    int j;    for(j = 0; j < m && count < n; ++j){        if(1 == ++hit[str[j]]){            ++count;        }    }    len = j;    end = j;    int i = 0;    while(i < m-1){        while(n == count && i < m-1){            if(0 == --hit[str[i++]]){                --count;            }        }        if( n != count && len > end - (i-1)){            begin = i-1;            len = end - (i-1);                }        for(j = end; count != n; ++j){            if(1 == ++hit[str[j%m]]){                ++count;                end = j+1;                if(j-i+1 < len){                    begin = i;                    len = j-i+1;                }            }        }    }     return len;}

 

 

 

知识共享许可协议
本文基于知识共享署名-非商业性使用 3.0 许可协议进行许可。欢迎转载、演绎,但是必须保留本文的署名林羽飞扬,若需咨询,请给我发信