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 R
And then read line by line: "PAHNAPLSIIGYIR"
找规律
#include<iostream>
#include<string>
using namespace std;
void Line(string s,string *res,int length,int cyclelen,int index,int nRows);
string convert(string s, int nRows) {
int length=s.length();
if(length<=0||nRows<0)
return NULL;
if(nRows==0||nRows==1)
return s;
int cyclelen=2*nRows-2;
string *res=new string[nRows];
for(int i=0;i<nRows;i++)
res[i]="";
Line(s,res,length,cyclelen,0,nRows);
Line(s,res,length,cyclelen,nRows-1,nRows);
if(nRows>2){
for(int i=1;i<nRows-1;i++)
Line(s,res,length,cyclelen,i,nRows);
}
string result;
for(int i=0;i<nRows;i++)
result+=res[i];
return result;
}
void Line(string s,string *res,int length,int cyclelen,int index,int nRows){
if((index==0)||(index==nRows-1)){
int j=index;
while(j<length){
res[index]+=s[j];
j+=cyclelen;
}
}
else{
int j=index;
int k=cyclelen-j;
while(j<length||k<length){
if(j<length)
res[index]+=s[j];
else
break;
if(k<length)
res[index]+=s[k];
else
break;
j+=cyclelen;
k+=cyclelen;
}
}
}
void main(){
string s="PAYPALISHIRING";
string result=convert(s,3);
cout<<result<<endl;
system("pause");
}