题目描述:
在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。
解题思路:
替换操作可以转换成,把 L 往左移动(需要左边是 X),把 R 往右移动(需要右边是 X)。
那么无论怎么移动,由于 L 和 R 无法互相穿过对方,那么去掉 X 后的剩余字符应该是相同的,否则返回 false。
然后用双指针遍历start和end的每一个位置,分类讨论:
如果当前字符为 L 且 i<j, 那么这个 L 由于无法向右移动,返回 false;
如果当前字符为 R 且 i>j,那么这个 R 由于无法向左移动,返回 false;
遍历完,若中途没有返回 false 就返回 true。
题解代码:
class Solution {
public boolean canTransform(String start, String end) {
int n = start.length();
int i = 0, j = 0;
while (true) {
//start中x是不影响的,直接跳过所有的x
while (i < n && start.charAt(i) == 'X') {
++i;
}
//同理可得
while (j < n && end.charAt(j) == 'X') {
++j;
}
//如果都顺利到达字符串的结尾 直接返回true
if (i == n && j == n) {
return true;
}
//如果有其中一个先到达 或者当前字符串的start的end是不相等的 直接返回false
if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
return false;
}
//如果L不能想左移动,或者R不能向右移动 直接返回false
if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
return false;
}
//继续接下来的过程
++i;
++j;
}
}
}