【LeetCode每日一题】2022-10-02 777. 在LR字符串中交换相邻字符 Java实现


题目

在这里插入图片描述

题目主要信息

题目中给出,有两种替换方式:

  • 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++;
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值