在一个由 '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"则相反。
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Scanner; 6 class Solution { 7 public boolean canTransform(String start, String end) { 8 9 10 11 char[] s = start.toCharArray(); 12 char[] e = end.toCharArray(); 13 List<Integer> sInt = new ArrayList<Integer>(); 14 List<Integer> eInt = new ArrayList<Integer>(); 15 List<Character> sList = new ArrayList<Character>(); 16 List<Character> eList = new ArrayList<Character>(); 17 18 //剔除两条字符串中"X" 19 for(int i=0; i<s.length; i++){ 20 if(s[i] != 'X'){ 21 sList.add(s[i]); 22 sInt.add(i); 23 } 24 } 25 for(int i=0; i<e.length; i++){ 26 if(e[i] != 'X'){ 27 eList.add(e[i]); 28 eInt.add(i); 29 } 30 } 31 32 //若处理后字符串不相等直接返回false 33 if(!sList.equals(eList)){ 34 return false; 35 } 36 37 //检查每个字符始末位置是否符合规则 38 for(int i=0; i<sInt.size(); i++){ 39 if(sList.get(i) == 'R'&&sInt.get(i) > eInt.get(i)){ 40 return false; 41 }else if(sList.get(i) == 'L'&&sInt.get(i) < eInt.get(i)){ 42 return false; 43 } 44 } 45 46 return true; 47 48 } 49 50 public static void main(String[] args) { 51 Solution s = new Solution(); 52 53 Scanner sca = new Scanner(System.in); 54 String start = sca.nextLine(); 55 String end = sca.nextLine(); 56 57 System.out.println(s.canTransform(start, end)); 58 } 59 60 } 61 62
1 class Solution { 2 public: 3 bool canTransform(string start, string end) { 4 if(start.length() != end.length())//长度不同,就算剔掉X之后相同,也是错的 5 return false; 6 int i=0,j=0; 7 while(i<end.length() && j<end.length()){ 8 while(start[i]=='X'){ //找到start串接下去的第一个非X字符 9 i++; 10 } 11 while(end[j]=='X'){ //找到end串接下去的第一个非X字符 12 j++; 13 } 14 //如果这俩个非X字符不同,则剔除掉X之后的串必然不同,所以是错的。 15 if(start[i] != end[j]) 16 return false; 17 if(start[i] == 'L' && i<j)//同为L,但在start的位置先于其在end串的位置,也是错的,L不能后移 18 return false; 19 if(start[i] == 'R' && i>j) 20 return false; 21 i++; 22 j++; 23 } 24 return true; 25 } 26 };