思路
需要理解start
中可以进行的操作:
L
只能向左移动,且左侧为X
时才能移动;R
只能向右移动,且右侧为X
时才能移动;RL
是不能够交换变成LR
的。
因此可以通过判断start
与end
中具有相同序号的非X
字符:start[i]
以及end[j]
这里的序号指:原字符串中非
X
的字符第几次出现。
- 如果
start[i] != end[j]
,直接返回false
即可。因为从上面讨论可以知道L
和R
是不能交换顺序的,因此相同序号处的非X
字符如果不同则一定无法通过交换获得。 - 如果
start[i] == end[j] == 'L' && i < j
,已知L
只能向左移动,而此时i<j
,需要向右移动才能交换得到end
,因此需要返回false
- 如果
start[i] == end[j] == 'R' && i > j
,已知R
只能向由移动,而此时i>j
,需要向左移动才能交换得到end
,因此需要返回false
- 显然如果
start
与end
中L
与R
的字符数量要相同,否则肯定无法通过交换得到end
。
实现代码如下:
public class Solution {
public boolean canTransform(String start, String end) {
int n = start.length();
char[] startArray = start.toCharArray();
char[] endArray = end.toCharArray();
//start中,R只能往右移动,L只能向左移动
int i=0,j=0;
while (i<n || j<n){
//跳过X
while(i<n && startArray[i] == 'X') {
i++;
}
while(j<n && endArray[j] == 'X') {
j++;
}
if (i == n || j == n){
return i==j; //两个字符串中L+R出现的次数不同,则一定是返回false
}
if (startArray[i] != endArray[j]){
return false; //L和R是不能够交换的因此L\R顺序不同则返回false;
}
if (startArray[i] == 'L' && i<j){
return false;
}
if (startArray[i] == 'R' && i>j){
return false;
}
i++;
j++;
}
return true;
}
}