串的模式匹配中以下标为1的元素为开始的问题

数据结构中串的模式匹配问题中有一些书里忽略的小细节,对于基础不好的人可能是个坑或者是个不好理解的问题。

 

问题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。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值