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'}
.
通用解法是BFS,但是本题用BFS求解会TLE,程序如下所示:
class Solution {
public boolean canTransform(String start, String end) {
Set<String> set = new HashSet<>();
set.add(start);
Queue<String> que = new ArrayDeque<>();
que.offer(start);
while (!que.isEmpty()){
int size = que.size();
for (int j = 0; j < size; ++ j){
String s = que.poll();
if (s.equals(end)){
return true;
}
char[] ch = s.toCharArray();
int len = s.length();
for (int i = 1; i < len; ++ i){
if (ch[i] == 'L' && ch[i-1] == 'X'){
ch[i] = 'X';
ch[i-1] = 'L';
String stmp = new String(ch);
if (!set.contains(stmp)){
set.add(stmp);
que.offer(stmp);
}
ch[i] = 'L';
ch[i-1] = 'X';
}
else if (ch[i] == 'X' && ch[i-1] == 'R'){
ch[i] = 'R';
ch[i-1] = 'X';
String stmp = new String(ch);
if (!set.contains(stmp)){
set.add(stmp);
que.offer(stmp);
}
ch[i] = 'X';
ch[i-1] = 'R';
}
}
}
}
return false;
}
}
可AC解法:
class Solution {
public boolean canTransform(String start, String end) {
int i = 0, j = 0, len = start.length();
while (i < len && j < len) {
while (i < len && start.charAt(i) == 'X'){
i++;
}
while (j < len && end.charAt(j) == 'X'){
j++;
}
if (i < len && j < len) {
char s = start.charAt(i);
char e = end.charAt(j);
if ((s != e) || (s == 'L' && i < j) || (s == 'R' && i > j)){
return false;
}
i++;
j++;
}
}
while (i < len) {
if (start.charAt(i) != 'X'){
return false;
}
i++;
}
while (j < len) {
if (end.charAt(j) != 'X'){
return false;
}
j++;
}
return true;
}
}