- 在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'。
题解:注意到,说白了就是’R’只能右移,'L’只能左移,然后根据end中的每个L和R的位置对start中的字符进行移动,先移动L,再移动R,可以先标记出end中的每个字符位置,做比较判断比较容易。
AC代码
class Solution {
public:
int L[10010],R[10010];
bool canTransform(string start, string end) {
int ansl=0,ansr=0;
for(int i=0;i<end.size();i++)
{
if(end[i]=='L')
L[ansl++]=i;
}
for(int i=end.size()-1;i>=0;i--)
{
if(end[i]=='R')
R[ansr++]=i;
}
if(start.length()!=end.length())return false;
int signl=0,ans=0;
//先把L往左移
for(int i=0;i<start.length();i++)
{
if(start[i]=='L')
{
int len=i-L[signl];
if(len<0)return false;
if(len<=ans)//说明前面有足够的X可以替换
{
swap(start[i],start[L[signl]]);
ans=len;//更新当前的X数目
}
else return false;//说明不能替换
signl++;
continue;
}
if(start[i]!='X')ans=0;
else ans++;
}
int signr=0;
ans=0;
//再把R右移
for(int i=start.length()-1;i>=0;i--)
{
if(start[i]=='R')
{
int len=R[signr]-i;
if(len<0)return false;
if(len<=ans)
{
swap(start[i],start[R[signr]]);
ans=len;
}
else return false;
signr++;
continue;
}
if(start[i]!='X')ans=0;
else ans++;
}
return start==end;
}
};