LeetCode(6)—— Z字形變換
阿新 • • 發佈:2018-12-16
題目內容
描述
將字串 "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
要注意的地方
- “陣列”的建立(“預佔位”的方式)