之前因為第五題最長回文字串需要使用到dp解法,所以我花了很長的時間來研究dp(因為每天又要上班,加上這段時間事情比較多,所以花了三個星期才搞定),好不容易算入了個門,有興趣的同學可以看看我寫的dp的文章,話不多說,今天開始繼續刷題。
題目:將乙個給定字串根據給定的行數,以從上往下、從左到右進行 z 字形排列。
比如輸入字串為"leetcodeishiring"
行數為 3 時,排列如下:
之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如:"lciretoesiigedhn"
。
請你實現這個將字串進行指定行數變換的函式:string convert(string s, int numrows);
示例1:輸入: s = "leetcodeishiring", numrows = 3
輸出: "lciretoesiigedhn"
示例2:輸入: s = "leetcodeishiring", numrows = 4
輸出: "ldreoeiiecihntsg"
解釋:
解法1:二維陣列
對於這種字串變換的問題,我向來都是很頭疼,一開始認為變化太多了很複雜,實際分析了一下這個題目後,發現並沒有我想象的那麼難。給定了乙個行數後,對於字串的走法,只有兩種一種是沿著當前這一列往下走,一種是斜著往上走。我們只要判斷一下,什麼時候需要往下,什麼時候需要斜著往上走就行了。定義乙個二維陣列,將字串存在對應的位置,遍歷完字串之後,再將陣列中的字元拼接起來,就能得到我們要的結果。
**如下:
1說明:這種解法的好處是思路簡單,題目在構建z字形變化時和我們平時使用的二維陣列剛好吻合,所以能讓人直觀的理解,缺點就是時間複雜度太高了,我們進行z字形變化所用的時間複雜度是o(n),但是我們把二維陣列中的字元重新取出卻要耗費o(n^2),得不償失,所以我就在想有沒有什麼更好的資料結構能夠利用一下,可惜沒想出來。class
solution 7//
/建立乙個stringbuilder,用來儲存最後的結果
8 stringbuilder stringbuilder = new
stringbuilder();9//
建立乙個二維陣列,用來儲存字串到對應的位置
10 character arr = new
character[numrows][s.length()];
11int num1 = 0;//
行號12
int num2 = 0;//
列號13
//遍歷字串
14for
(character c : s.tochararray())
23 }else27}
28//
此時二維陣列中記錄了所有的字元了,按照順序,取出不為空的字元
29for (int i = 0; i < numrows; i++)34}
35}36return
stringbuilder.tostring();37}
38 }
解法二:建立乙個stringbuilder的list
這個是leetcode提供的官方解法,思路真的是相當之巧妙,建立乙個stringbuilder的list,用來儲存每一行的字串,其他的思路和上面的類似,就是兩種走法,往下走和往上走。只不過最後我們獲得結果的時候,只需要把list中的stringbuilder憑藉到一起就可以了。
**如下:
1class
solution
7 listlist = new arraylist<>();
8for (int i = 0; i < numrows; i++)
11boolean bool = true;12
int cos = 0;//
行號13
//只有兩個地方需要進行變化,乙個是在第一行,乙個時在最後一行
14for
(character c : s.tochararray())
19if (cos == 0)
22if
(bool)else27}
2829 stringbuilder result = new
stringbuilder();
30for
(stringbuilder stringbuilder : list)
33return
result.tostring();34}
35 }
演算法 Z字形變換
6.z 字形變換 將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n 之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lcire...
演算法 Z 字形變換。
將乙個給定字串根據給定的行數,以從上往下 從左到右進行 z 字形排列。比如輸入字串為 leetcodeishiring 行數為 3 時,排列如下 l c i r e t o e s i i g e d h n之後,你的輸出需要從左往右逐行讀取,產生出乙個新的字串,比如 lciretoesiigedh...
Z字形變換
題目 將字串 paypalishiring 以z字形排列成給定的行數 p a h n a p l s i i g y i r 之後從左往右,逐行讀取字元 pahnaplsiigyir 思路 通過從左向右迭代字串,我們可以輕鬆地確定字元位於 z 字形圖案中的哪一行。演算法 我們可以使用 min num...