版权声明:本文为博主原创文章,如需转载,请注明出处。 https://blog.csdn.net/qq_37174526/article/details/81812117
题目内容
描述
将字符串 "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
要注意的地方
- “数组”的创建(“预占位”的方式)