近日在面試美團的時候手撕一道回溯法的演算法題,題意如下:
給定乙個數字字串,要求將這個數字字串進行分割,使得分割的結果為有效的ip位址。樣例輸入:
樣例輸出:25525511135
255.255.11.135, 255.255.111.35這道題其實可以看做是字串分段問題,再輸入的字串中加入三個點,將字串分割成四段,每一段必須合法,求所有可能的情況。目前遇到字串的處理經驗為:1、若題目問的是字串的子串行問題首先考慮使用動態規劃的方法,2、如果題目問的是求出所有可能的情況,那麼首先考慮使用遞迴的方法。所以這道題使用遞迴的方法求解。
使用n表示當前已經分了幾個分段,注意到此處的輸入為字串型別,那麼如果想將將其轉化成int型別變數的話可以先使用c_str()函式將其轉化成字元陣列,然後使用atoi()函式將其轉化成int型資料,這樣就可以和0-255這個範圍進行比較了。
遞迴的大致思路如下:
1. 將最後的結果存入乙個全域性的字串向量res中。
2. 遞迴的函式有四個引數,分別是剩下的字串s,已經分段的個數n,分割過程中產生的臨時結果out,結果向量res。
3. 如果已經完成了四段的分割,那麼將結果push_back()入res中
4. 否則的話,下乙個分段的長度為1-3,對於每一種長度,都要求大小在0-255之間,而且除了0以外不能夠以0開頭。如果滿足條件的話。進入5。
5.遞迴,遞迴引數為餘下的字串,n+1,out+s.substr(0,k)+(n==3?"":"."),結果向量res。
**如下:
#include #include #include using namespace std;
void helper(string s, int n, string out, vector& res)
else
}}int main()
}
上述**中有一段非常巧妙的**(當然不是我想的,下次我應該可以想的出來:( ):
int val = atoi(s.substr(0, k).c_str());
if (val > 255 || k != to_string(val).size()) continue;
這裡atoi可以將字元陣列轉化成整型數字
第二行的又使用to_string來將數字轉化成字串,然後通過比較這兩個字串的長度就可以判斷是不是以0開頭的不為0的數字了。
通過以上的分析,我們可以得出乙個遞迴處理字串所有可能子串的題目的一般方法:
1. 判斷分段是否結束,如果結束,那麼將臨時結果存入最終結果中,否則的話執行2
2. 從乙個分段的起始條件開始,判斷當前分段是否滿足題意,如果滿足題意,那麼遞迴,否則的話,增加字串的長度,重複執行2.
參考資料:
數字字串,每三個數字加上逗號
將每三個數字加上逗號處理 通常使用金額方面的編輯 param str 無逗號的數字 return 加上逗號的數字 private static string addcomma string str strtemp reversestr.substring i 3,i 3 3 將 789,456,中最...
求兩個超長數字字串的和 Python
求兩個超長數字字串的和 python 123 0 333 9 如 12345 67890 分析思路 求 求兩個超長數字字串的和 1 先把兩個字串強制轉換成數字 2 把兩個數字相加即可得到加和 str1 1233333336666666663345 str2 678333366666666666666...
使用指標統計字串中的數字字元的個數
程式設計基礎實訓指導教程 c語言 isbn 978 7 03 032846 5 p925.1.2 上級實訓內容 實訓內容6 統計字串中的數字字元,如字串中的內容是 2def35adh253kjsdf7 kj8655x,結果為11 分割線isdigit函式 isdigit 語法 include int...