從周日開始做real time vision 做到了周二,然后周三一整天被老板壓迫工作到晚上10點(diǎn)半T^T
1點(diǎn)多終于有時(shí)間開始刷題了...[感覺面試要死了]
對于大部分的面試算法,我都是嗤之以鼻的因?yàn)椴]有什么卵用。這個(gè)題算是少數(shù)覺得比較實(shí)用的算法吧
這道題我看到的第一想法是 ?假設(shè)不考慮代碼,人是怎么判斷的。
"ABCCED" 人類會先從字母A開始行動(dòng),找整個(gè)array。 找不到這個(gè)字母的話就直接宣布說這個(gè)word找不到。
找到的話,繼續(xù)下一個(gè)字母去找, 然后重復(fù)。唯一要注意的就是,每個(gè)字母不能重復(fù)使用。人類在做這個(gè)的時(shí)候,會記住哪些字母自己已經(jīng)用過了然后不會去用。由于之前做過一道題類似,使用之前的方法就是把到過的地方mark used。
但是稍微實(shí)現(xiàn)一點(diǎn)代碼后會發(fā)現(xiàn),需要至少3個(gè)For loop:
第一層: 我們需要一個(gè)一個(gè)letter的走,
第二層,我們需要iterate row,
第三層 iterate col.
如果被用過的地方,我們可以把上面的char 變成一個(gè)奇怪的字符之類的。
但是發(fā)現(xiàn)每一個(gè)字母都要Iterate整個(gè)array發(fā)現(xiàn)都找不到才能判定是不是真的不存在。
after 20分鐘以后。。。我突然發(fā)現(xiàn)理解錯(cuò)題目了。。是問sequentially adjacent。。。OMG。。。
...我簡直不敢相信這道題竟然花了我一個(gè)小時(shí)。。。。
有幾個(gè)很傻比的問題錯(cuò)誤?
一個(gè)是我做的時(shí)候竟然還是iterate string.
正確思路應(yīng)該是 只要第一個(gè)char 對上了以后, 馬上開始recursion,之后的活交給recursion function來做。
check() function里面的if( || || || ||) 是一個(gè)又tricky又不tricky的東西。形象一點(diǎn)的說法就是派上下左右4個(gè)小分隊(duì)去偵查,只要有一個(gè)小分隊(duì)成功,就代表我們找到了subproblem的解。我之前刷的題里幾乎沒有用過這么多or operation 來判斷的,所以也算一個(gè)鍛煉了。
還一個(gè)很容易犯的錯(cuò)誤就是沒有會忘了char recover back。 因?yàn)閞ecursion的過程中我們嘗試了很多可能,如果失敗的話之前試過的整個(gè)partial string都是不行的。 但是由于已經(jīng)放了empty char 在那個(gè)position, 以后的recursion會誤以為那個(gè)點(diǎn)被用過了。所以和backtrack的思路一樣,我們需要recover back。?