包含集合的最短子串
2014-09-21 17:53
176 查看
有一个子串和一个集合,集合中的字符不重复,求子串中最短的包含集合的子串长度,如果不存在,返回0
例:
set: abc
string: axbyczab
return: czab 4
方法:用滑动窗口加上状态位来解决
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<string>
#include <limits.h>
using namespace std;
int hashs[256];
int getMin(char str[],int n, char *src)
{
int i;
int num=0;
int len = INT_MAX;
for(i=0;i<256;i++)
hashs[i] = -1;
for(i=0;i<n;i++)
hashs[str[i]] = 0;
char *p = src, *q = src;
while(*p!=0&&num<n)
{
if(hashs[*p]!=-1)
{
if(hashs[*p]==0)
num++;
hashs[*p]++;
}
p++;
}
if(*p==0&&num!=n)
return 0;
len = p - q ;
while(q!=p)
{
if(hashs[*q]==-1)
q++;
else
{
hashs[*q]--;
if(hashs[*q]==0)
{
if(p-q<len)
len = p -q;
hashs[*q]++;
break;
}
q++;
}
}
while(*p!=0)
{
if(hashs[*p]==-1)
p++;
else
{
hashs[*p]++;
while(q!=p)
{
if(hashs[*q]==-1)
q++;
else
{
hashs[*q]--;
if(hashs[*q]==0)
{
if(p-q+1<len)
len = p -q+1;
hashs[*q]++;
break;
}
q++;
}
}
p++;
}
}
return len;
}
int main()
{
char str[10];
char src[100];
int n;
int result;
while(cin>>str)
{
int len = strlen(str);
cin>>src;
result = getMin(str, len, src);
cout<<result<<endl;
}
return 0;
}
例:
set: abc
string: axbyczab
return: czab 4
方法:用滑动窗口加上状态位来解决
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<string>
#include <limits.h>
using namespace std;
int hashs[256];
int getMin(char str[],int n, char *src)
{
int i;
int num=0;
int len = INT_MAX;
for(i=0;i<256;i++)
hashs[i] = -1;
for(i=0;i<n;i++)
hashs[str[i]] = 0;
char *p = src, *q = src;
while(*p!=0&&num<n)
{
if(hashs[*p]!=-1)
{
if(hashs[*p]==0)
num++;
hashs[*p]++;
}
p++;
}
if(*p==0&&num!=n)
return 0;
len = p - q ;
while(q!=p)
{
if(hashs[*q]==-1)
q++;
else
{
hashs[*q]--;
if(hashs[*q]==0)
{
if(p-q<len)
len = p -q;
hashs[*q]++;
break;
}
q++;
}
}
while(*p!=0)
{
if(hashs[*p]==-1)
p++;
else
{
hashs[*p]++;
while(q!=p)
{
if(hashs[*q]==-1)
q++;
else
{
hashs[*q]--;
if(hashs[*q]==0)
{
if(p-q+1<len)
len = p -q+1;
hashs[*q]++;
break;
}
q++;
}
}
p++;
}
}
return len;
}
int main()
{
char str[10];
char src[100];
int n;
int result;
while(cin>>str)
{
int len = strlen(str);
cin>>src;
result = getMin(str, len, src);
cout<<result<<endl;
}
return 0;
}
相关文章推荐
- 包含集合的最短子串
- 一长串字符串中找包含字符串集合的最短字串
- 一道题:给一个字符串,和一个字符集,求该字符串包含所有字符集的最短子串
- 【百度面试题】求包含固定字符集的最短子串
- 求有N种颜色的珠子串中包含所有颜色的最短子串
- 一个字符串中包含另一个字符串所有字符的最短子串
- 给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n)
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
- 求字符串内不包含重复字符的最长子串的集合
- 给一个很长的字符串str 还有一个字符集比如"abc" 找出str 里包含"abc"的最短子串。要求O(n)
- 每天学习一算法系列(30)(给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str 里包含{a,b,c}的最短子串。要求O(n).)
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
- 包含字符集的最短子串
- 找出此产品描述中包含N个关键字的长度最短的子串
- 给定一个字符串,找到包含该字符串所有字符的最短子串
- 求珠子上最短的包含所有颜色的子串
- 每天一道LeetCode-----在字符串s中找到最短的包含字符串t中所有字符的子串,子串中字符顺序无要求且可以有其他字符
- 算法题:给定一字符串,求其包含给定字符集中所有字符的最短子串
- 华为2016笔试题(输入一个字符串,求出该字符串包含的字符集合)
- .net 一个集合list 不包含另一个集合listb中的数据