def get_Next_list(data): #initilize NeatList and left_mark next = [0 for i in range(len(data))] left=0 #[5,0] rift=len(data)-1 for rift_mark in range(rift,-1,-1): rift_mark_pointer = rift_mark while rift_mark>=left: if data[left] != data[rift_mark]: break elif data[left] == data[rift_mark] and rift_mark != left: next[rift_mark_pointer]+=1 rift_mark -=1 continue else: break return next def KMP(data,target,nest): #initilize data left_mark = 0 if nest!=None: while left_mark < len(target): for rift_mark in range(left_mark, left_mark + len(target) + 1): if data[rift_mark] == target[rift_mark - left_mark]: if rift_mark - left_mark + 1 == len(target): return True elif nest[rift_mark - left_mark - 1] != 0: left_mark += nest[rift_mark - left_mark - 1] + 1 else: left_mark += 1 return False if __name__ == '__main__': data = 'aabaab1aaf' target = 'aab1aaf' next = get_Next_list(data=target) print(next) print(KMP(data=data,nest=next,target=target))