题目
题目主要信息
题目中给出,有两种替换方式:
- LX 替换 XL
- XR 替换 RX
可以将字符串中的 X 看作空位,那么上述两种替换方式可以理解为:
- 在不越过其它字符的前提下,将L向左移动
- 在不越过其它字符的前提下,将R向右移动
其中,L和R是不能交换位置的
如果start可以通过这两种移动方式转换为end,必须要满足以下条件:
- 去除空格,字符串中的L和R必须一一对应
- 对应的L在start中的位置要靠右,即大于等于在end中的位置(这样才有左移的余地)
- 对应的R在start中的位置要靠左,即小于等于在end中的位置(这样才有右移的余地)
这样这道题就变成了对字符位置的比较和判断
具体步骤
用变量 i 和变量 j 分别指向字符串 start 和 end ,跳过 X,当碰到的字符不是X时,用 startChar 和 endChar记录下来,
- 如果 startChar 和 endChar不相等,那么直接返回false
- 如果相等,还要就 startChar 和 endChar 是 L 还是 R分开讨论
- 如果是L(因为L可以在满足条件的情况下向左移),则要求 startChar 中的 L 的下标大于等于 endChar 中 L 的下标
- 如果是R(因为R可以在满足条件的情况下向右移),则要求 startChar 中的 R 的下标要小于等于 endChar 中的 R的下标
不过也存在 start 和 end 中 L 和 R 的总数和 end 中 L 和 R 的总数不一样的情况,这样,可能 i 会比 j 先结束,或者 j 会比 i 先结束。
LXX
LXL
或
RXR
RXX
这样,在while循环结束以后,还需要再判断一下
class Solution {
public boolean canTransform(String start, String end) {
//获取字符串的长度
int len = start.length();
//i用来遍历start
int i = 0;
//j用来遍历end
int j = 0;
char startChar = 0, endChar = 0;
while (i < len && j < len) {
while (i < len && start.charAt(i) == 'X') {
i++;
}
if (i != len) {
startChar = start.charAt(i);
}
while (j < len && end.charAt(j) == 'X') {
j++;
}
if (j != len) {
endChar = end.charAt(j);
}
if (startChar != endChar) {
return false;
} else if ((startChar == 'L' && i < j) || (startChar == 'R' && i > j)) {
return false;
}
i++;
j++;
}
if (j >= len && i < len) {
while (i < len) {
if (start.charAt(i) != 'X') {
return false;
}
i++;
}
}
if (i >= len && j < len) {
while (j < len) {
if (end.charAt(j) != 'X') {
return false;
}
j++;
}
}
return true;
}
}
class Solution {
public boolean canTransform(String start, String end) {
//获取字符串的长度
int len = start.length();
//i用来遍历start
int i = 0;
//j用来遍历end
int j = 0;
while (true) {
while (i < len && start.charAt(i) == 'X') {
i++;
}
while (j < len && end.charAt(j) == 'X') {
j++;
}
if (i >= len && j >= len) {
return true;
}
if (i >= len || j >= len || start.charAt(i) != end.charAt(j)) {
return false;
}
if (start.charAt(i)=='L' && i < j){
return false;
}
if (start.charAt(i)=='R' && j < i){
return false;
}
i++;
j++;
}
}
}