LeetCode 6. ZigZag Conversion

Zetrue_Li發表於2018-05-05

一、     問題描述:

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows likethis: (you may want to display this pattern in a fixed font for betterlegibility)

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

And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversiongiven a number of rows:

string convert(string s, int numRows);

Example1:

Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Example2:

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
 
P     I    N
A   L S  I G
Y A   H R
P     I

 

二、     問題分析:

    首先確定ZigZagConversionZ字轉換)的定義:將給定的字串根據行數先轉換為示例所展示的Z形結構,最後將其逐行讀取構成新的字串。

example 1為例子:

    輸入字串為"PAYPALI SHIRING", 行數為3,所以列出的Z形結構為:

    P   A  H   N

    A P L S I I G

    Y   I   R

    逐行讀取方式:  

    

    所以輸出的字串就應為:"PAHNAPLSIIGYIR"

 

三、     演算法設計:

    1、 假定給定字串為S,行數為rows

    2、 因為要根據所給的字串羅列出Z形結構,Z形結構可以看成一個二維字元陣列(空白看成是空字元‘’);

    3、 因為構造行已知但列未知的二維陣列很難實現,所以可以等價構造出目的二維矩陣的轉置矩陣E

    4、 定義行計數變數num =0b=0,遍歷字串S,執行以下操作:

        a)     若行b0,即第一行,則將E[num]整行填充rows個字元;

        b)     若行b不為0,則對應的將E的第num行第rows-b-1個元素,即E[num][rows-b]填充字元,其餘元素填充空字元

        c)      b = b+1, num = num+1

    5、 E按行優先進行字串遍歷,獲得的字串即為目的字串

 

四、     程式實現:

class Solution:
	def convert(self, s, numRows):
		"""
		:type s: str
		:type numRows: int
		:rtype: str
		"""
		s = list(s)
		arr = []
		h = 0
		num = 0
		a = 0
		newstr = []
		while(num < len(s)):
			row = ['' for a in range(numRows)]
			if(a==0 or a==numRows-1):
				for b in range(numRows):
					if(num < len(s)):
						row[b] = s[num]
					num+=1
			else:
				row[numRows-1-a] = s[num]
				num += 1
			a = (a + 1)%numRows
			if(a==numRows-1):
				a = 0
			h += 1
			arr.append(row)
			
		for a in range(numRows):
			for b in range(h):
				if(arr[b][a]!=''):
					newstr.append(arr[b][a])
		return ''.join(newstr)

相關文章