题目为:在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
我理解的题目解析: 1)‘R’只能向右移动,并且只能移向’X’,‘L’只能向左移动,并且只能移向’X’。
2)若字符串为奇数个,且最后剩余3个字符,则应该比较后两个,跳过第三个
当l左边为x时,l应该向左边移动,故移动后的字符串应该是lx,与输入的匹配字符串不符合,应该是false,但题目预期结果是true,我不太清楚为什么是true,求解答,谢谢
我的代码如下:
public boolean canTransform(String start, String end) {
//题目解析: 1)‘R’只能向右移动,并且只能移向’X’,‘L’只能向左移动,并且只能移向’X’。
// 2)若字符串为奇数个,且最后剩余3个字符,则应该比较后两个,跳过第三个
//将两个字符串存入数组
String[] arrStart=start.split("");
String[] arrEnd=end.split("");
//如果两个数组长度不相等,直接返回false
if(arrStart.length!=arrEnd.length){
return false;
}
//如果两个字符串都只有一个字符
if(arrStart.length==1){
if(arrStart[0].equals(arrEnd[0])){
return true;
}
return false;
}
//若为多个字符
for(int i=1;i<arrStart.length;){
//字符串为奇数个,且i是倒数第三个,将第三位跳过
//此时length-1为索引最后一位,因为i是从1开始比较当前一位和前一位的,故要再减1,将位置定在倒数第二位
if(arrStart.length%2!=0 & i==arrStart.length-1-1){
i++;
}else{
//为RX
if(arrStart[i-1].equals("R") & arrStart[i].equals("X")){
arrStart[i-1]="X";
arrStart[i]="R";
i=i+2;
continue;//这里需写continue;否则下面的if也会执行
}
//为XL
if(arrStart[i-1].equals("X") & arrStart[i].equals("L")){
arrStart[i-1]="L";
arrStart[i]="X";
i=i+2;
continue;
}else{
//若都不是,则i往后移2位
i++;
}
}
}
//注意,这里要用循环判断数组是否相等,不能用arrStart.equals(arrEnd)来判断
for(int i=0;i<arrStart.length;i++){
if(!arrStart[i].equals(arrEnd[i])){
return false;
}
}
//若两个数相等,则返回true
return true;
}