开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、777. 在LR字符串中交换相邻字符
原题链接:777. 在LR字符串中交换相邻字符
题目描述:
在一个由
'L','R'和` 'X'
三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。 一次移动操作指用一个"LX"替换一个"XL",>或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系>列移动操作使得start可以转换成end时, 返回True`。/
示例 :
输入: start = "RXXLRXRXL", end = "XRLXXRRLX"
输出: True
解释:
我们可以通过以下几步将start转换成end:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX
/
提示:
1 <= len(start) = len(end) <= 10000。
start和end中的字符串仅限于'L', 'R'和'X'。
解题思路:
为了确定start字符串是否可以通过交换相邻字符获得end字符串,我们可以同时遍历两个字符串,当遇到可以确定两者不能通过交换字符而相等的情况时,返回false即可,完全遍历完说明符合条件,返回true;
那么我们应该怎么判断情况呢?
通过题目我们可以知道,交换字符是通过:'RX' 替换成 'XR' 或 'XL' 替换成 'LX' 实现的,如果两者符合条件可以交换相邻字符获取对方,当将字符串中所有字符‘L’删去,剩下的两个字符串是相同的。
①反过来想,我们便利时忽略掉字符‘L’,当遍历的两个字符不相等时,就能确定不符合条件,返回false了。
到这里还不能完全排除不符合条件的情况,另一个情况如下,那就是:
②根据规则:一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。
- 当start字符串遍历到L或者R,都因该是XL或RX,而end字符串是LX或XR
- 所以当start遍历到L,下标i应该 大于等于 end字符串的下标j,因为start中XL的
L在X之后 - 所以当start遍历到R,下标i应该 小于等于 end字符串的下标j,因为start中RX的
R在X之前 - 如果遇到不符合上述描述的情况,搜可以返回false了
③我们按照上述的操作推演一下,就知道这最后一个元素会是'X',否则返回false
当两个字符串都顺利遍历完,说明排除了所有无法交换获得的情况,可以返回true。
提交代码:
class Solution {
public boolean canTransform(String start, String end) {
int n = start.length(); //获取字符串长度,方便遍历
int i = 0,j = 0; //用i表示start字符串下标,用j表示end字符串下标
while(i < n && j < n){ //同时遍历
while(i < n && start.charAt(i) == 'X'){//跳过start字符串中的‘X’
++i;
}
while(j < n && end.charAt(j) == 'X'){ //跳过end字符串中的‘X’
++j;
}
if(i < n && j < n){
//忽略掉‘X’字符发现剩下的字符不对应,说明无法通过交换相邻字符获得
if(start.charAt(i) != end.charAt(j)){
return false;
}
//当我们按照前面的步骤遍历,根据规则:一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。
//当start字符串遍历到L或者R,都因该是XL或RX,而end字符串是LX或XR
//所以当start遍历到L,下标i应该 大于等于 end字符串的下标j,因为start中XL的`L`在`X`之后
//所以当start遍历到R,下标i应该 小于等于 end字符串的下标j,因为start中RX的`R`在`X`之前
//所以遇到不符合上述描述的情况,搜可以返回false了
char ch = start.charAt(i);
if(ch == 'L' && i < j || ch == 'R' && i > j){
return false;
}
++i;++j;
}
}
//当我们遍历到最后,一个字符串已经遍历完成,剩下一个字符串遍历到最后一个元素
//我们按照上述的操作推演一下,就知道这最后一个元素会是'X',否则返回false
while(i < n && i < j){
if(start.charAt(i) != 'X')
return false;
++i;
}
while(j < n && j < i){
if(end.charAt(j) != 'X')
return false;
++j;
}
//两个字符串遍历完无异常,就说明start可以通过交换相邻字符获得end,返回true
return true;
}
}
提交结果: