算法思想:
子串每次从前向后比较,比较到最后和源字符串一样就说明匹配到了,只要遇到不一样的就看对齐后的子串末尾对应的源串的后一个字符是否在子串中存在根据这个来挪子串的位置,如果挪到最后还不能找到的话就说明没有
实现过程如下:
目标是为了找wo
H | e | l | l | o | w | o | r | l | d | |
---|---|---|---|---|---|---|---|---|---|---|
w | o |
1、首先wo和He进行匹配,一个一个配,发现H和w不匹配,然后再和长度的下一位l进行匹配,发现l也不在匹配内容当中,然后移到第四位如下
H | e | l | l | o | w | o | r | l | d | |
---|---|---|---|---|---|---|---|---|---|---|
w | o |
2、然后按上步再次进行匹配,发现还是没有,然后继续。
H | e | l | l | o | w | o | r | l | d | |
---|---|---|---|---|---|---|---|---|---|---|
w | o |
3、然后发现wo分别与待匹配字符串相比发现一样,最后返回w的地址,匹配结束。
需要注意的是,在匹配长度的下一位字符如果在匹配字符中的话,则与匹配字符串对齐然后一一比对,若比对成功返回第一个字符的地址,否则再按第一步继续。
代码如下:
def sunday(S, T):
ls, lt = len(S), len(T)
#记录下标
d = 0
#保证T有成为S子串的前提下并且循环
while d <= ls - lt:
# 判断下标是否超出,超出这说明不存在子串
if d > ls: return False
if S[d:d+lt] == T:
#如果符合,返回下标
return d
else:
p = T.rfind(S[d+lt])
#返回字符串最后一次出现的位置,如果没有匹配项则返回-1
if p == -1:
#没有匹配,跳子串长度个距离
d += lt + 1
else:
#有匹配,对齐查看是否全部匹配
d += lt - p
return False