777. 在LR字符串中交换相邻字符【双指针】

思路

需要理解start中可以进行的操作:

  1. L只能向左移动,且左侧为X时才能移动;
  2. R只能向右移动,且右侧为X时才能移动;
  3. RL是不能够交换变成LR的。

因此可以通过判断startend中具有相同序号的非X字符:start[i]以及end[j]

这里的序号指:原字符串中非X的字符第几次出现。

  1. 如果start[i] != end[j],直接返回false即可。因为从上面讨论可以知道LR是不能交换顺序的,因此相同序号处的非X字符如果不同则一定无法通过交换获得。
  2. 如果start[i] == end[j] == 'L' && i < j,已知L只能向左移动,而此时i<j,需要向右移动才能交换得到end,因此需要返回false
  3. 如果start[i] == end[j] == 'R' && i > j,已知R只能向由移动,而此时i>j,需要向左移动才能交换得到end,因此需要返回false
  4. 显然如果startendLR的字符数量要相同,否则肯定无法通过交换得到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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值