在一个由 'L'
, 'R'
和 'X'
三个字符组成的字符串(例如"RXXLRXRXL"
)中进行移动操作。一次移动操作指用一个"LX"
替换一个"XL"
,或者用一个"XR"
替换一个"RX"
。现给定起始字符串start
和结束字符串end
,请编写代码,当且仅当存在一系列移动操作使得start
可以转换成end
时, 返回True
。
示例 :
输入: start = "RXXLRXRXL", end = "XRLXXRRLX" 输出: True 解释: 我们可以通过以下几步将start转换成end: RXXLRXRXL -> XRXLRXRXL -> XRLXRXRXL -> XRLXXRRXL -> XRLXXRRLX
注意:
1 <= len(start) = len(end) <= 10000
。start
和end
中的字符串仅限于'L'
,'R'
和'X'
。
这个问题的描述有一定误导性,问题中所指的移动操作真的是只限定于"LX" to "XL",而不能是"XL" to "LX"。
接下来分析问题,剔除两条字符串中的所有"X",会发现若两条字符串符合条件,经剔除"X"后所得的两条字符串是完全相同的。
如例中:start = "RLRRL", end = "RLRRL"。
再根据"L"只能后移"R"只能前移的特性,可得知"L"移动后在字符串中序号大于等于移动前,"R"则相反。
代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class No_777 {
public static boolean canTransform(String start, String end) {
char[] s = start.toCharArray();
char[] e = end.toCharArray();
List<Integer> sInt = new ArrayList<Integer>();
List<Integer> eInt = new ArrayList<Integer>();
List<Character> sList = new ArrayList<Character>();
List<Character> eList = new ArrayList<Character>();
//剔除两条字符串中"X"
for(int i=0; i<s.length; i++){
if(s[i] != 'X'){
sList.add(s[i]);
sInt.add(i);
}
}
for(int i=0; i<e.length; i++){
if(e[i] != 'X'){
eList.add(e[i]);
eInt.add(i);
}
}
//若处理后字符串不相等直接返回false
if(!sList.equals(eList)){
return false;
}
//检查每个字符始末位置是否符合规则
for(int i=0; i<sInt.size(); i++){
if(sList.get(i) == 'R'&&sInt.get(i) > eInt.get(i)){
return false;
}else if(sList.get(i) == 'L'&&sInt.get(i) < eInt.get(i)){
return false;
}
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sca = new Scanner(System.in);
String start = sca.nextLine();
String end = sca.nextLine();
System.out.println(canTransform(start, end));
}
}