使用上次的那个c[a[i]-‘a’]++;这种方法进行字符串对应0到26出现的次数的计数,后通过从0到26的循环看特定位置两个数组大小是否一致可以完成第一个问题的解决。
第二个问题因为子串内可以交换但却不能中间加入其他字符,先将第一个以第一种方式存入,后将第二个每n个(子串长度)一循环后每次都建立新的数组,新的循环,新的比较。只要有一个字母的个数不同就跳出,代表改子串不符合条件,继续向下遍历,如果26个都循环完了,说明是子串则结束。
1.
子串中间的字符可以交换顺序也可以含有其他字符
如abdccba 包含ac 。
#include<stdio.h>
#include<string.h>
main(){
char a[99],b[99];
gets(a);
gets(b);
int i,j,n,m,flag=0;
int c[26]={
0};
int d[26]={
0};
n=strlen(a);
m=strlen(b);
for(i=0;i<n;i++)
{
c[a[i]-'a']++;
}
for(i=0;i<m;i++)
{
d[b[i]-'a']++;
}
for(i=0;i<26;i++)
{
if(c[i]!=d[i]&&c[i] != 0)
{
printf("Flase");
return 0;
}
}
printf("yes");
}
2.s2中间字符可以交换顺序但是不能含有其他字符
`
#include<stdio.h>
#include<string.h>
main(){
char a[99],b[99];
gets(a);
gets(b);
int i,n,m;
int c[26]={
0};
n=strlen(a);
m=strlen(b);
for( i=0; i<n; i++)
{
c[a[i]-'a']++;
}
for (i = 0; i <= (m - n); i++) {
int d[26] = {
0};
int j;
for(j = i; j < n+i; j++)
{
d[b[j]-'a']++;
}//遍历建立s2中长度为len(s1)的子串
for (j = 0; j < 26; j++) {
if (c[j] != d[j] ) {
break; // 只要有一个字母的个数不同就跳出,代表改子串不符合条件,继续向下遍历
}
}
if (j == 26) {
printf("Yes");
return 0;
}
}
printf("None"); //遍历完所有子串都不行
}