数据结构中串的模式匹配问题中有一些书里忽略的小细节,对于基础不好的人可能是个坑或者是个不好理解的问题。
问题1:为什么从ch[1]开始?
这个问题我想了半天没有得到答案,不过上机测试了下,如果从ch[0]开始,2处语法改为“i=i-j+1”,其他语句不变,并不能出现想要的结果,输出“-3”,如果想要得到正确的输出,则需要在输入字符串的时候刻意忽略第一个元素,即下标为0的元素,可以在那个位置上输入任何的元素都对结果没有影响
这里的S串第一个元素我输入的是空格,T串第一个元素我输入了#号,都没有任何影响,运行结果如下:
而由此也可以看到算法中还存在一个问题:既然下标为0的第一个元素并没有存放串的长度,为什么不能从ch[0]开始匹配呢?记录下这个问题。
另外还做了一些实验,如果不指定T.length也不能运行,程序直接报错,匹配的时候就进行不下去了,但如果指定了T.length的值,那么实验结果又表明还存在问题是这个T.length的值和实际的串长度的值似乎没有什么关系,但实际长度小于指定长度又会报错,这又是为什么呢?
归根结底有一个疑问:T.ch[0]和S.ch[0]到底存了什么?有什么特别?
问题2:i=i-j+2是为什么?
这个式子其实是 i 和 j 同加,但例如他们从i = 1移动到i = 4,只移动了3次,也就是i - 3 就可以到原来的位置,同理,i 和 j 同加的时候,i 只需要减去 j-1 就可以回到原来的位置,而从原来的位置再加 1 ,就是下一次匹配 i 的开始位置。
问题3:为什么 i - T.length?
这个问题很好理解,循环中当最后一个匹配完之后,j = T.length,所以还要实行一遍 j++ 和 i++ ,由此跳出循环的时候i应该比实际匹配成功的那个位置多 1 ,也就是如果 i 在 i = 5处匹配完成,但此时跳出循环的 i == 6。