从周日开始做real time vision 做到了周二,然后周三一整天被老板压迫工作到晚上10点半T^T
1点多终于有时间开始刷题了...[感觉面试要死了]
对于大部分的面试算法,我都是嗤之以鼻的因为并没有什么卵用。这个题算是少数觉得比较实用的算法吧
这道题我看到的第一想法是 假设不考虑代码,人是怎么判断的。
"ABCCED" 人类会先从字母A开始行动,找整个array。 找不到这个字母的话就直接宣布说这个word找不到。
找到的话,继续下一个字母去找, 然后重复。唯一要注意的就是,每个字母不能重复使用。人类在做这个的时候,会记住哪些字母自己已经用过了然后不会去用。由于之前做过一道题类似,使用之前的方法就是把到过的地方mark used。
但是稍微实现一点代码后会发现,需要至少3个For loop:
第一层: 我们需要一个一个letter的走,
第二层,我们需要iterate row,
第三层 iterate col.
如果被用过的地方,我们可以把上面的char 变成一个奇怪的字符之类的。
但是发现每一个字母都要Iterate整个array发现都找不到才能判定是不是真的不存在。
after 20分钟以后。。。我突然发现理解错题目了。。是问sequentially adjacent。。。OMG。。。
...我简直不敢相信这道题竟然花了我一个小时。。。。
有几个很傻比的问题错误
一个是我做的时候竟然还是iterate string.
正确思路应该是 只要第一个char 对上了以后, 马上开始recursion,之后的活交给recursion function来做。
check() function里面的if( || || || ||) 是一个又tricky又不tricky的东西。形象一点的说法就是派上下左右4个小分队去侦查,只要有一个小分队成功,就代表我们找到了subproblem的解。我之前刷的题里几乎没有用过这么多or operation 来判断的,所以也算一个锻炼了。
还一个很容易犯的错误就是没有会忘了char recover back。 因为recursion的过程中我们尝试了很多可能,如果失败的话之前试过的整个partial string都是不行的。 但是由于已经放了empty char 在那个position, 以后的recursion会误以为那个点被用过了。所以和backtrack的思路一样,我们需要recover back。