1. 程式人生 > >LeetCode(6)—— Z字形變換

LeetCode(6)—— Z字形變換

題目內容

描述

將字串 "PAYPALISHIRING"以Z字形排列成給定的行數:

P   A   H   N
A P L S I I G
Y   I   R

之後從左往右,逐行讀取字元:"PAHNAPLSIIGYIR"

實現一個將字串進行指定行數變換的函式:

string convert(string s, int numRows);

示例:

  • 示例1
輸入: s = "PAYPALISHIRING", numRows = 3
輸出: "PAHNAPLSIIGYIR"
  • 示例2
輸入: s = "PAYPALISHIRING"
, numRows = 4 輸出: "PINALSIGYAHRPI" 解釋: P I N A L S I G Y A H R P I

解法 —— 逐行追加+方向控制

開始我死活沒看出來這怎麼是個Z,原來是N字型,倒著的Z

看上去好像要開個二維陣列,然後一個一個字元放進去,然後再讀出來,其實只要把“N“字型從左右兩邊同時向中間壓扁,這樣就只需要開一個高度為“|”的字串陣列,然後每到第一行和最後一行,就改變尋找下一次放字元所在行的方向。

 def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
maxPalindromeLen = 0 maxPalindrome = "" n = len(s) if n == 1: maxPalindromeLen = 1 maxPalindrome = s return maxPalindrome for i in range(n): for j in range(i, n): sub_str=s[i:j+1] if
self.isPalindrome(sub_str): if j - i + 1 > maxPalindromeLen: maxPalindromeLen = j - i + 1 maxPalindrome = sub_str return maxPalindrome def isPalindrome(self, s): n = len(s) # 根據迴文的對稱性,兩個指標往中間靠攏 head = 0 tail = n - 1 while (head <= tail): if s[head] != s[tail]: return False head += 1 tail -= 1 return True

要注意的地方

  • “陣列”的建立(“預佔位”的方式)