In a string composed of ‘L’, ‘R’, and ‘X’ characters, like “RXXLRXRXL”, a move consists of either replacing one occurrence of “XL” with “LX”, or replacing one occurrence of “RX” with “XR”. Given the starting string start and the ending string end, return True if and only if there exists a sequence of moves to transform one string to the other.
Example:
Input: start = "RXXLRXRXL", end = "XRLXXRRLX"
Output: True
Explanation:
We can transform start to end following these steps:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX
Note:
1 <= len(start) = len(end) <= 10000.
Both start and end will only consist of characters in {‘L’, ‘R’, ‘X’}.
思路:
初始想法:暴力搜索,遇到”XL”,且对应位置不相等的情况,就replace成”LX”, 而且一旦replace之后,它不再可逆,所以最终一定能够自动终止,在所有可能的replace中,找出end态,可惜DFS超时,所以代码也就不上了。
class Solution {
public boolean canTransform(String start, String end) {
if (!start.replace("X", "").equals(end.replace("X", "")))
return false;
char[] s = start.toCharArray();
char[] e = end.toCharArray();
int n = s.length;
int i = 0, j = 0;
while (i < n && j < n) {
while (j < n && e[j] == 'X') j ++;
while (i < n && s[i] == 'X') i ++;
if (i == n || j == n) break;
if (s[i] == 'R' && i > j) return false;
if (s[i] == 'L' && i < j) return false;
i ++;
j ++;
}
return true;
}
}