在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

在一个由 '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. 1 <= len(start) = len(end) <= 10000
  2. startend中的字符串仅限于'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 };
原文地址:https://www.cnblogs.com/dream-to-pku/p/9870796.html