题目要求:给定一长字符串和一短字符串。请问,如何最快的判断短字符串中的所有字符是否都在长字符串中。
解法一:(蛮力轮询)
轮询短字符串中的每一个字符,逐个与长字符串中的每个字符进行比较。
代码略
解法二:(排序后轮询)
先将两个字符串进行排序,然后依次轮询,减少时间复杂度
代码略
解法三:(素数相乘)
(1)按照从大到小的顺序,用26个素数分别代替长字符串中的所有字母
(2)遍历长字符串,得到素数乘积。
(3)遍历短字符串,判断b中的字母对应的素数是否能被整除。
(4)输出结果
解法四:(位运算法)
关键:建立哈希表
用位运算为长字符串计算签名,在注意将短字符串的字符放到长字符串中查找。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int includeString(char *a,char *b){
int hash = 0,i = 0;
for(i =0 ; i < strlen(a) ; i ++){
int temp = 1 << (a[i] - 'A');
hash |= temp;
}
printf("%d\n",hash);
for(i = 0 ; i < strlen(b) ; i ++){
if((hash & 1 << (b[i] - 'A') == 0))
return 1;
}
return 0;
}
int main()
{
char a[100] = "ABCD";
char b[100] ="ABC";
int result = includeString(a,b);
printf("%d",result);
return 0;
}
举一反三:变位词
题目要求:如果两个字符串中的字符一样,出现次数一样,只是出现的顺序不一样,则认为这两个字符串为兄弟字符串。如果判断两个字符串是兄弟字符串?
思路:
擦混剪一个长度为26的数组,轮询第一个字符串,每个字母出现之后相应的位置加1,轮询第二个数组,每个字母出现的相应位置减1,轮询结束后,若数组中每一个位置均为0,则为兄弟字符串,反之,则不是
代码如下:
#include <stdio.h>
#include <stdlib.h>
int brotherWord(char *a,char *b){
int temp[26] = {0};
int i;
for(i = 0; i < strlen(a) ; i++){
temp[a[i] - 'A'] ++;
}
for(i = 0; i < strlen(b); i ++){
temp[b[i] - 'A'] --;
}
for(i = 0 ; i < 26; i++){
if(temp[i] ==1){
return 1;
}
}
return 0;
}
int main()
{
char a[100] ="ASDFF";
char b[100] ="SDFAF";
int result = brotherWord(a,b);
printf("%d",result);
return 0;
}