刷題第十四天
93. 復原 IP 地址:
這題設置一個pn,記錄已經(jīng)加了多少個‘.’,當pn==3時,驗證最后一段是否合法,合法加入結果集。這里對string的處理,用了insert函數(shù)和erase函數(shù)。

78. 子集:
子集需要收集每個節(jié)點的結果,遞歸函數(shù)設置兩個參數(shù),一個是nums數(shù)組,一個是開始下標s,先收集path,再開始for循環(huán)。畫出樹會容易很多。

90. 子集 II:
這題和78是差不多的思路,但是這題nums有重復的數(shù)值,因此需要去重。采用map記錄nums元素是否被使用過。
這題的關鍵在于,去重一定要先將nums排序。我一開始模擬[1,2,2],重復的數(shù)值會在同一個for循環(huán)出現(xiàn),這樣就方便去重。但如果是[2,1,2],模擬一下樹會發(fā)現(xiàn),重復的數(shù)值不在同一個層次了。

491.?遞增子序列:
要在每一個節(jié)點收集結果的話,就不需要在收集之后return了。如果在終止條件里還return的是收集葉子節(jié)點的。
這題也是設置一個map記錄已經(jīng)出現(xiàn)過的元素進行去重,但這題不需要排序就可以去重,原因是,遞增子序列的根本其實是排列,排列是有順序的,上面做的比如子集問題,子集是沒有順序的,沒有實現(xiàn)排列的話,那么會出現(xiàn)重復的但順序不一樣的子集。但這題要求的是遞增的子序列,重復的不滿足要求的子集自然就排除了。畫一下圖會很好理解。

46. 全排列:
終止條件是當path的長度等于nums的長度時,記錄進結果集。設置一個for循環(huán),每次都從0開始,循環(huán)到結尾。先將nums[i]存進path,然后遞歸刪除了nums[i]的nums,遞歸結束pop。

47. 全排列 II:
46題再加個map標記遍歷過的num就好了。

332. 重新安排行程:
困難題,我不會,一臉蒙,看了題解。用unordered_map<string起始機場,map<string到達機場,int趟數(shù)>>數(shù)據(jù)結構。當res的長度為機場數(shù)時返回true。循環(huán)當前機場可以到達的所有機場,如果還有趟數(shù),就存進結果集,趟數(shù)減一,遞歸到達的機場到下一個機場,遞歸結束趟數(shù)要加回來。