变位词问题,假设有a和b两个字符串,判断b是否为a子串的变位词。例如a = "hello" 时b="ell"、"lel" 、"le" 返回true,b="elo"返回false
假设全是a~b的字母组成
解:利用滑动窗口思想。
代码如下
bool IsChangedWord(char *a,int la,char *b,int lb)
{
if (a == NULL || b==NULL || la<lb)
{
throw std::exception("Invalid input.");
}
int num[25] = { 0 };
int nonZero = 0;
for (int i=0;i<lb;++i)
{
if (++num[b[i] - 'a'] == 1) nonZero++;
}
for (int i = 0; i<lb; ++i)
{
int c = a[i] - 'a';
num[c]--;
if (num[c] == 0) nonZero--;
else if(num[c] == -1) nonZero++;
}
if (nonZero == 0) return true;
for (int i=lb;i<la;++i)
{
int c = a[i - lb] - 'a';
num[c]++;
if (num[c] == 0 ) nonZero--;
else if (num[c] == 1) nonZero++;
c = a[lb] - 'a';
num[c]--;
if (num[c] == 0) nonZero--;
else if (num[c] == -1) nonZero++;
if (nonZero == 0) return true;
}
return false;
}
int main()
{
char *a = "hello",*b="ell";
cout<<IsChangedWord(a, 5, b, 3)<<endl;
return 0;
}