本题解决思路是有限状态机FSM,构建排列时有两种状态,要么向上,要么向下,状态间如何切换呢?向上且处于第一行那就该掉头向下了,向下且处于最后一行那就改掉头向上了。思路就是这样。
class Solution { public String convert(String s, int numRows) { if(s.length()<2||numRows<2) return s; List<StringBuilder> demo = new ArrayList<>(); for(int i=0;i<Math.min(s.length(), numRows);i++){ demo.add(new StringBuilder()); } int down=1; int row=0; for(char c:s.toCharArray()){ demo.get(row).append(c); if((row==0&&down==-1)||(row==numRows-1&&down==1)){ down*=-1; } if(down==1){ row++; }else{ row--; } } StringBuilder returnStr = new StringBuilder(); for(StringBuilder sb:demo){ returnStr.append(sb); } return returnStr.toString(); } }
class Solution: def convert(self, s: str, numRows: int) -> str: if(numRows<2): return s demo = [[] for i in range(min(len(s), numRows))] down = 1 row = 0 for c in s: demo[row].append(c) if((row==0 and down==-1)or(row==numRows-1 and down==1)): down*=-1 if down==1: row+=1 else: row-=1 result = '' for i in demo: for j in i: result+=j return result