在一个由 ‘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; } };