申明:因本人参考较少,仅是突然想到没有查阅是否已经有别人想到,因此本文:如有雷同 纯属巧合。。。
两个字符串,第一个str1,第二个人str2,判断str2是否为str1的子串。
思路:利用 ASCII码求和来判断。
'a'的ASCII码为97
这里简单起见,假设'a'的ascii码为1,'b'的为2,以此类推。。。
str1: 'abaacdeabaacdfabaadeee'
str2: 'abaade'(6位)
先计算str2的ASCII码总和为1+2+1+1+4+5=14,str1从与str2相同的位数开始,也计算6位字符的ASCII码值,为1+2+1+1+3+4=12,两者不相等,因此往后挪一位,
值变成12-1(str1的首位为a)+5(str1的第七位为e)=16. 依然不相等,因此,继续往后挪。
需要注意的是,很有可能会出现总和相同,而实际不同的两个字符串,如其中的str1中的’deabaa‘,此时需要比较’deabaa‘与 'abaade',检测是否真的相同,结果显然不相 同。因此继续挪位。直到挪到最后或者出现的相同的子串为止。
代码如下:(在逻辑上正确,求字符ascii码的和上只做了意思表达。)
bool isTotalEqual(char str1,int start, int end, char str2[]){//长度相同,判断是否相等
int i=start;
for(;i<=end;i++){
if(str1[i]!=*str2)
return false;
str2++;
}
return true;
}
bool isSubString(char str1[], char str2[]){
if(str2 == NULL) return true;
if(str1 == NULL) return false;
int len1=0;
int len2=0;
int i=0;
int index=0;
int sum1=0;
int sum2=0;
while(str1[len1]!='\0'){
len1++;
}
while(str2[len2]!='\0'&&len1>=len2){//求字符串ASCII编码和
sum2+=str2[len2];
sum1+=str1[len2++];
}
if(len1<len2) return false;//子串长于被查找串
i=len2;
while(i<len1){
if(sum1==sum2){//若ASCII编码和相同,查看是否完全相同
if(isTotalEqual(str1,index,i-1,str2)){
return true;
}
}
sum1-=str1[index++];//求累加和
sum1+=str1[i++];
}
return false;
}
求喷