版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/90044548
在一个由 ‘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'。
题目的意思是说 ‘R’只能向右移动,并且只能移向’X’,‘L’只能向左移动,并且只能移向’X’。
第一:如果将start、end中的‘X’全部去掉得到的newStart 和 newEnd相等才有可能转换成功。
第二:如果start中'R'的左边'X'的个数超过在end中对应位置的'R'的左边'X'的个数,则不能转换成功,因为start中的'R'只能向右移动,右边的'X'只能增加不能减少
第三:如果end中'L'的左边'X'的个数超过在start中对应位置的'L'的左边'X'的个数,则不能转换成功,因为start中的'L'只能向左移动,左边的'X'只能减少不能增加
class Solution {
public:
bool canTransform(string start, string end) {
int strSize = (int)start.size(), i = 0, j = 0;
while(i < strSize && j < strSize){
//第一步:跳过'X'
while (i < strSize && start[i] == 'X'){
++i;
}
while (j < strSize && end[j] == 'X'){
++j;
}
//第二步:判断去掉'X'是否相同
if (start[i] != end[j]){
return false;
}
//第三步:检测start中'L'左边'X'的个数是否不少于end中对应位置的'L'左边的'X'个数
//第四步:检测start中'R'左边'X'的个数是否不多余end中对应位置的'R'左边的'X'个数
if ((start[i] == 'L' && i < j) || (end[j] == 'R' && i > j)){
return false;
}
++i;
++j;
}
return true;
}
};