leetcode题目2:
题目描述
我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。
在本题里,字母板为board = [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”].
我们可以按下面的指令规则行动:
如果方格存在,‘U’ 意味着将我们的位置上移一行;
如果方格存在,‘D’ 意味着将我们的位置下移一行;
如果方格存在,‘L’ 意味着将我们的位置左移一列;
如果方格存在,‘R’ 意味着将我们的位置右移一列;
‘!’ 会把在我们当前位置 (r, c) 的字符 board[r][c] 添加到答案中。
返回指令序列,用最小的行动次数让答案和目标 target 相同。你可以返回任何达成目标的路径。
解答
初步想法:应该是有一个函数控制移动(U,P,R,L),主函数里需要循环要到达的字母,如果查找到就要记上一个“!”;
1.初次提交:
主函数:
string alphabetBoardPath(string target) {
int x=0,y=0,n=target.length();
string ans="";
for (int i=0;i<n;i++){
char c=target[i];
ans+=move(c,x,y);
ans+="!";
}
return ans;
}
move函数:
string move(char c,int &x,int &y){
int p=c-'a';
int gx=p/5,gy=p%5;
string ret="";
if (c=='z'){
while(x<gx) ++x,ret+="D";
while(x>gx) --x,ret+="U";
while(y<gy) ++y,ret+="R";
while(y>gy) --y,ret+="L";
return ret;
}else{
while(y<gy) ++y,ret+="R";
while(y>gy) --y,ret+="L";
while(x<gx) ++x,ret+="D";
while(x>gx) --x,ret+="U";
}
return ret;
提交之后结果出错:
分析原因:给的是5*5的方阵,但是多出来一个z,要单独考虑,上面提交的代码虽然考虑了z,要单独处理,但是单独处理的情况应该是下一步要走的前驱在"z",所以加上一个字符prev就可以了:
最终代码:
class Solution {
public:
string move(char prev,char c,int &x,int &y){
int p=c-'a';
int gx=p/5,gy=p%5;
string ret="";
if (prev=='z'){
while(x<gx) ++x,ret+="D";
while(x>gx) --x,ret+="U";
while(y<gy) ++y,ret+="R";
while(y>gy) --y,ret+="L";
}else{
while(y<gy) ++y,ret+="R";
while(y>gy) --y,ret+="L";
while(x<gx) ++x,ret+="D";
while(x>gx) --x,ret+="U";
}
return ret;
}
string alphabetBoardPath(string target) {
int x=0,y=0,n=target.length();
char prev='#';
string ans="";
for (int i=0;i<n;i++){
char c=target[i];
ans+=move(prev,c,x,y);
prev=c;
ans+="!";
}
return ans;
}
};