777. 在LR字符串中交换相邻字符
难度中等231
在一个由 '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'
。
注意!!
1 <= len(start) = len(end) <= 10000
一次移动操作指用一个"LX"
替换一个"XL"
,或者用一个"XR"
替换一个"RX"
翻译:我们的L可以跨过无数个X,往左边移动。我们的R可以跨国无数个X,往右边移动。
停下来有两种情况
- 数组已经直接遍历完了,被迫停止
- 遇到了不是
X
的字符,例如遇到了R或者L
思路:
本题的知识点双指针
我们定义一个指针i,用于遍历start字符串
定义一个指针j,用于遍历end字符串
步骤:
- 开始遍历,找到第一个不是X的字符。
- 如果这两个字符相等。以start为标准
- 如果是L的话,因为L只能向左边移动。所以如果start字符串的指针的值,小于end字符串指针的值的话,那么就不可能了
- 如果是R的话,因为R只能向右边移动。所以如果大于的话,那就不可能了。
- 如果这两个字符不相等。那么一定是false。
- 如果这两个字符相等。以start为标准
循环结束的时候,如果i != j,那么直接就是错误了。
如图可以看到,当有一个指针结束遍历的时候,如果另外一个指针没有结束遍历,那么一定无法转换成功。
class Solution {
public boolean canTransform(String start, String end) {
int N = start.length();
int i = 0;
int j = 0;
while (i < N || j < N) {
// 找到start和end中不是X的字符
while (i < N && start.charAt(i) == 'X') i++;
while (j < N && end.charAt(j) == 'X') j++;
if (i == N || j == N) {
// 为了避免越界问题,这里马上就进行一次判断,理由和 ** 处是一样的,所以这里写break也可以。
return i == j;
}
if (start.charAt(i) != end.charAt(j)) return false;
if (start.charAt(i) == 'L' && i < j) return false;
if (start.charAt(i) == 'R' && i > j) return false;
i++;
j++;
}
return i == j; // **
}
}
本文含有隐藏内容,请 开通VIP 后查看