标签:相同 i++ swa code 成功 示例 字符 char amp
在一个由 ‘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 }
标签:相同 i++ swa code 成功 示例 字符 char amp
原文地址:https://www.cnblogs.com/blog-of-zxf/p/11332420.html