演算法實戰(六)Z 字形變換

2022-02-05 07:23:01 字數 2424 閱讀 2060

之前因為第五題最長回文字串需要使用到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

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 }

說明:這種解法的好處是思路簡單,題目在構建z字形變化時和我們平時使用的二維陣列剛好吻合,所以能讓人直觀的理解,缺點就是時間複雜度太高了,我們進行z字形變化所用的時間複雜度是o(n),但是我們把二維陣列中的字元重新取出卻要耗費o(n^2),得不償失,所以我就在想有沒有什麼更好的資料結構能夠利用一下,可惜沒想出來。

解法二:建立乙個stringbuilder的list

這個是leetcode提供的官方解法,思路真的是相當之巧妙,建立乙個stringbuilder的list,用來儲存每一行的字串,其他的思路和上面的類似,就是兩種走法,往下走和往上走。只不過最後我們獲得結果的時候,只需要把list中的stringbuilder憑藉到一起就可以了。

**如下:

1

class

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...