LeetCode第五题
来源:4-2 map的使用 Intersection of Two Arrays II
我是笨笨蛋
2020-05-14
老师,这是第五题的中心扩展法的解法,对于这个解法我对图上标记的地方不理解为什么要这样写。比如R-L-1这个地方为什么要-1呢?其次,maxlen>end-start+1这个地方为什么要+1呢?我的理解是这个private函数的作用是返回回文字符串的长度,那么就不需要-1,然后start是回文字符串开始的位置,end是结束的位置,那么maxlen>end-start就可以跟新start和end,不需要+1。但是我按照我的思路提交之后发现并不对,希望老师可以详细的讲解下这些边界问题。
1回答
-
这个代码我不细看了,我给你提供一些处理/理解这写边界的建议:
以 start, end 来说,这一个是一个子字符串起始的位置;一个是一个子字符串终止的位置。那么这个子字符串的长度是什么?
假设start = 2, end = 7,那么这个子字符串的索引就是 2 3 4 5 6 7;这个子字符串的长度是 6,就是 7 - 2 + 1;
所以,整个子字符串的长度就是 end - start + 1
那么 maxlen > end - start + 1 的意思就是,如果当前找到的 maxlen,比 [start, end] 所代表的这个子字符串的长度还要长的话,就做一些事情。
注意我上面的分析,清晰地把每一个变量究竟代表什么,用自然语言表述了出来,这是分析边界的关键。
边界处理的关键不是分门别类地记忆哪里应该 +1,哪里应该 -1,而是搞清楚每个变量到底表示什么意思,我们又要求什么,然后,该不该 +1 还是 -1,是自然而然的计算结果。
比如,有的时候,我们表示子字符串,这个 end 可能指向的不是最后一个字符位置,而是最后一个字符的后一个位置,也就是所谓的前闭后开,[start, end),那么这种情况,整个子字符串的长度,就是 end - start。
你看,end 的定义变了,计算方式就变了。这并非是什么规律,需要记下来,完全是为了实现了我们自己的逻辑。
说回上面的 R - L - 1。
我也不知道为什么 -1。
因为,首先,我不知道这个函数在算什么。func 是一个极其差的函数命名,没有透露出任何有意义的信息。我不知道这个函数要算什么,自然也不知道这个函数怎么算是正确的。
其次,我也不清楚 L 和 R 的具体定义。
但是整体,你可以搞清楚 func 到底要算什么?L 和 R 到底是什么意思。在这个基础上,去考察,为什么 最终算出这个结果,要 -1,我相信并不难。
如果你搞清楚了每个变量的具体定义,搞清楚了每个函数的意义,还是不明白这里为什么要 +1,那里为什么要 -1,我的建议也很简单,找一个小数据,实际去调试跟踪,看看,对于这个数据,在程序具体执行的时候,每个变量取值都是怎样的?为什么取值是这样的?这个取值最终为什么通过这样的计算,才能得到那个想要的结果?或者你觉得应该怎样算?实际这样算出来的结果对不对?为什么不对?
进步就发生在这个过程。调试程序是一个重新梳理自己逻辑的过程,而不是随意试一试,这里把 +1 去掉;那里把 -1 去掉,看看行不行的过程。
继续加油!:)
112020-05-15
相似问题