题目链接:https://leetcode-cn.com/problems/swap-adjacent-in-lr-string/description/
在一个由 '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中L只能往左移动,XR中R只能往右移动。所以我们只要比较start与end中LR的相对位置就行了,即start的第n个L的位置必须在end的第n个L的右边,start的第n个R的位置必须在end的第n个R的左边。当然在此之前,可以先判断两个字符串中XLR的个数是否相同。
代码如下:
bool canTransform(char* start, char* end) {
int slen=strlen(start),elen=strlen(end);
if(slen!=elen){
return false;
}
if(strcmp(start,end)==0){
return true;
}
int x=0,l=0,r=0;
int local[10005],k=0;
char temp[10005];
for(int i=0;i<slen;i++){
if(start[i]=='X'){//X计数
x++;
}
else if(start[i]=='L'){//L计数
l++;
}
else{//R计数
r++;
}
if(end[i]=='X'){//X对比
x--;
}
else if(end[i]=='L'){//L对比
l--;
}
else{//R对比
r--;
}
if(start[i]!='X'){//记录LR相对位置与具体位置
temp[k]=start[i];
local[k]=i;
k++;
}
}
if(x!=0||l!=0||r!=0){//XLR个数不相同则返回false
return false;
}
k=0;
for(int i=0;i<elen;i++){
if(end[i]=='L'){
if(end[i]==temp[k]&&local[k]>=i){//start的L只能在end的L右边
k++;
}
else{
return false;
}
}
else if(end[i]=='R'){
if(end[i]==temp[k]&&local[k]<=i){//start的R只能在end的R左边
k++;
}
else{
return false;
}
}
}
return true;
}