首页 > 代码库 > [算法]求一段包含所有种类的字符子串
[算法]求一段包含所有种类的字符子串
有一个字符串首尾相连(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 许可协议进行许可。欢迎转载、演绎,但是必须保留本文的署名林羽飞扬,若需咨询,请给我发信
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。