在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
思路分析:
这道题一定要仔细阅读题目,不然很容易就会看错:只能用LX
替换XL
或者用XR
替换RX
。
通过分析得知,这种替换不会影响L和R的相对顺序(可以举个例子去掉X字符看看结果),而且start中R字符的位置一定
<=
end中R字符的位置,start中L字符的位置一定>=
end中R字符的位置。
那么我们就可以用双指针的办法,用i
和j
遍历start和end,遇到X字符就跳过。
1️⃣ 如果两个字符不相等,就返回false。
2️⃣ 如果两个字符相等,就判断相对顺序,不满足条件就返回false。
3️⃣ 最后还要加一个条件,因为会出现有一个字符串还买遍历完的情况,后边的字符必须全部为X,不是就返回false。
class Solution {
public:
bool canTransform(string start, string end) {
int sz = start.size();
int i = 0, j = 0;
while(i < sz && j < sz)
{
// 跳过X
while(i < sz && start[i] == 'X')
{
i++;
}
while(j < sz && end[j] == 'X')
{
j++;
}
// 判断字符是否相等
if(i < sz && j < sz)
{
if(start[i] != end[j])
{
return false;
}
else// 判断与X的相对顺序
{
if(start[i] == 'L' && i < j)
{
return false;
}
if(start[i] == 'R' && i > j)
{
return false;
}
}
i++;
j++;
}
}
// 出循环后后边必须全为X
while(i < sz)
{
if(start[i] != 'X')
{
return false;
}
i++;
}
while(j < sz)
{
if(end[j] != 'X')
{
return false;
}
j++;
}
return true;
}
};
纸上得来终觉浅,绝知此事要躬行。
本文含有隐藏内容,请 开通VIP 后查看