DFS求解DecodeWays輸出所有情況和方法數

2021-08-09 22:50:01 字數 1116 閱讀 5104

這是一道leetcode上的原題,在筆試面試中也經常遇到。一般我們只要求出所有的解碼種類數目就可,並沒有要求輸出所有的解碼序列,這裡運用dfs解決了這個問題。題目描述如下:

現在我們先求解一下編碼方法數。通過題目我們可以知道,編碼是通過乙個或兩個字元來實現,對於乙個編碼「12125」;可以乙個乙個字元的進行編碼,也可以兩個來進行,這就類似於我們的爬樓梯問題,一次可以上乙個台階,一次也可以上兩個台階,求所有的方式,何其相似。因此我們也可以運用動態規劃來求解本題,只是要加上一些條件判斷。乙個字元是如果是『0』,那麼不能解碼,就依賴於他前乙個字元看看能否組成10-26之間的數進行解碼,因此對於從0-n位置的字元,他的方法數為f(n)=f(n-1)+f(n-2);即對n位置,他可以選擇自己單獨解碼,也可選擇與前面一起解碼。具體**如下:

int numdecodings(string &s)

; dp_num[0] =1;

for (int i =1; i < len; i++)

}return dp_num[len -1];

}

當然如果要輸出所有的解碼方式具體是怎麼樣,可以進行dfs,比如12125,我們選擇1這個字元解碼,也可以選擇12進行解碼,之後2125或125相當於是乙個新的字元要進行解碼,不斷進行搜素,終止條件為到達字串尾。**如下:

/*

s表示原始字串,用引用,通過下標可以獲取到字元

temp 用來儲存解析好的字串,最後輸出,用引用,一直記錄解碼後的字元,直至遞迴返回

start表示從第幾個位置的字元開始解析

end表示s.size();

*/void numdecodings_list(string &s,string &temp,int start,int end)

if (s[start] != '0')//第乙個不為0

}}int main(void)

}

輸出如下:

DFS求解數獨演算法

以前也想過很久解數獨的演算法,但是沒有得到很簡單的方法,某天看到某位學長的 恍然大悟,本以為暴力搜尋會很花時間 10 81種可能 沒想到實際上由於各種限制,列舉次數竟然普遍小於10000次,用dfs便可實現每種可能都列舉。這樣計算乙個數獨就很快了 不到1ms 下面附上自己理解改動並加了注釋的 dev...

整數劃分問題 遞迴,dfs求解

給定任何乙個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。當n 7,共有14種拆分方法 這道題目我們可以想到其實應該用遞迴來做,而dfs又是可以使用遞迴求解,我們首先可以在遞迴函式裡進行拆分的列舉,需要拆分的數應該是能夠由哪一些數相加,怎樣設計遞迴函式dfs呢,我們應該清楚應該拆分n,比如...

DFS和BFS求解島嶼數量

給乙個01矩陣,1代表是陸地,0代表海洋,如果兩個1相鄰,那麼這兩個1屬於同乙個島。我們只考慮上下左右為相鄰。島嶼 相鄰陸地可以組成乙個島嶼 相鄰 上下左右 判斷島嶼個數。示例1輸入 1,1,0,0,0 0,1,0,1,1 0,0,0,1,1 0,0,0,0,0 0,0,1,1,1 返回值3 備註 ...