document.write('
方法一:直接法
最直接的方法就是对于s2中的每个字符,通过遍历字符串s1查看是否包含该字符。实现代码如下:
def isContain(str1,str2):
len1=len(str1)
len2=len(str2)
#字符串ch1比ch2短
if len1<len2:
i=0
while i<len1:
j=0
while j<len2:
if list(str1)[i]==list(str2)[j]:
break
j+=1
if (j>=len2):
return False
i+=1
else:
#字符串ch1比 ch2长
i=0
while i<len2:
j=0
while j<len1:
if (list(str1)[j]==list(str2)[i]):
break
j+=1
if j>=len1:
return False
i+=1
return True
if __name__=="__main__":
str1="abcdef\'
str2="acf"
isContain=isContain(str1, str2)
pririt str1+"与"+str2,
if (isContain):
print "有包含关系"
else:
print "没有包含关系"
程序的运行结果为:
abcdef与acf有包含关系
算法性能分析:
这种方法的时间复杂度为O(m*n),其中,m与n分别表示两个字符串的长度。
方法二:空间换时间法
首先,定义一个flag数组来记录较短的字符串中字符出现的情况,如果出现,那么标记为1,否则标记为
0,同时记录flag数组中1的个数count;接着遍历较长的字符串,对于字符a,若原来flag[a]==1,则修改
flag[a]=0,并将count减1;若flag[a]==0,则不做处理。最后判断count的值,如果count==0,那么说明
这两个字符有包含关系。实现代码如下:
def isContain(s1,s2):
k=0 #字母对应数组的下标
#用来记录52个字母的出现情况
flag=[None]*52
i=0
while i<52:
flag[i]=0
i+=1
count=0 # 记录段字符串中不同字符出现的个数
len1=len(s1)
len2=len(s2)
#shortStr, longStr 分别用来记录较短和较长的字符串
#maxLen, minLen 分别用来记录较长和较短字符的长度
if len1<len2:
shortStr=s1
minLen=len1
longStr=s2
maxLen=len2
else:
shortStr=s2
minLen=len2
longStr=s1
maxLen=len1
#遍历短字符串
i=0
while i<minLen:
#把字符转换成数组对应的下标(大写字母0~25,小写字母26~51)
if ord(list(shortStr)[i])>=ord(\'A\') and ord(list(shortStr)[i])<=ord(\'Z\'):
k=ord(list(short,Str)[i])-ord(\'A\')
else:
k=ord(list(shortStr)[i])-ord(\'a\')+26
if flag[k]==0:
flag[k]=1
count+=1
i+=1
#遍历长字符串
j=0
while j<maxLen:
if ord(list(longStr)[j])>=ord(\'A\') and ord(list(longStr)[j])<=ord(\'Z\'):
k=ord(list(longStr)[j])-ord(\'A\')
else:
k=ord(list(longStr)[j])-ord(\'a\')+26
if flag[k]==1:
flag[k]=0
count-=1
if count==0:
return True
j+=1
return False
if __name__=="__main__":
str1="abcdef"
str2="acf"
isContain=isContain(str1, str2)
priit str1+"与"+str2,
if isContain:
print "有包含关系"
else:
print "没有包含关系"
算法性能分析:
这种方法只需要对两个数组分别遍历一遍,因此,时间复杂度为O(m+n)(其中m、n分别为两个字符串的长
度),与方法一比,本方法的效率有了明显的提升,但是其缺点是申请了52个额外的存储空间。
');