Problem:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I RAnd then read line by line:
“PAHNAPLSIIGYIR” Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR“.
思路:
先建立nRows个list存储每一行输出字符串,用i遍历输入字符串,用listindex确定当前字符放入哪个list。用isForward作为游标确定listindex增加的方向,如遇整除则令方向相反。最后再把nRows个list的字符按顺序连起来。时间复杂度为O(n)。
Solution:
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 16 10:41:51 2017
@author: liangsht
"""
class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
size = len(s)
i = 0
listindex = 0
isForward = True
lists = [[] for j in range(numRows)]
#print lists
if size == 0 or size == 1:
return s
while i<size:
substr = s[i]
lists[listindex].append(substr)
if numRows == 1:
return s
elif i % (numRows-1) == 0 and i != 0:
isForward = not isForward
i = i + 1
if isForward :
listindex = listindex + 1
else:
listindex = listindex - 1
#print i,listindex,isForward
string = ""
for j in range(numRows):
for i in range(len(lists[j])):
string = string + lists[j][i]
#print lists[j]
return string