777.在LR字符串中交换相邻字符

在一个由 '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'。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/swap-adjacent-in-lr-string 著作权归领扣网络所有。

 1     public boolean canTransform(String start, String end) {
 2         int len = start.length(),i=0,j=0;
 3         
 4         while(i< len && j < len){
 5         //第一步:start 和 end 都跳过左边的'X'
 6             while(i < len && start.charAt(i) == 'X'){
 7                 i++;
 8             }
 9             while(j < len && end.charAt(j) == 'X'){
10                 j++;
11             }
12             if(i == len && j == len) return true;  //XXLXXXX->XXLXXXX
13             if(i == len || j == len) return false;  //X->R
14             
15         //第二步:查看当前两个指针指向的字符是否一样,不一样说明无法通过题意的移动方式转变为相同的字符串
16             if(i < len && j < len && start.charAt(i) != end.charAt(j)){
17                 return false;
18             }
19         //经过以上操作有:start[i] == end[j] 为‘R’或者‘L’
20         //第三步:检查此时start和end中'R'左边的'X'的个数,如果前者大于后者,那不能成功。
21         //为什么呢?因为按题意'R'只能向右移动,且移动时'X'会向左移,即‘R’左边的‘X’只会变多
22         //如果start中‘R’左边的‘X’都比end中的多,那再怎么移动,也不能使start中‘R’左边的‘X’个数等于end中的
23             
24             if(i < len && j < len && start.charAt(i) == 'R' && i > j) return false;
25             
26         //第四步:同理,检查此时start和end中'L'左边的'X'的个数,如果后者大于前者,那不能成功。
27         //因为‘L’只能向左移动,如果start中‘L’左边的‘X’个数比end中‘L’左边的少,那么start中移动‘L’
28         //只会让这个数更少
29             
30             if(i < len && j < len && start.charAt(i) == 'L' && i < j) return false;
31             
32         //第五步:检查完都进入下一步
33             i++;
34             j++;
35         }
36         return true;
37     }

 

posted on 2019-08-10 17:52  大猫食小鱼  阅读(500)  评论(0编辑  收藏  举报