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

题目描述:

在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True。

解题思路:

替换操作可以转换成,把 L 往左移动(需要左边是 X),把 R 往右移动(需要右边是 X)。
那么无论怎么移动,由于 L 和 R 无法互相穿过对方,那么去掉 X 后的剩余字符应该是相同的,否则返回 false。
然后用双指针遍历start和end的每一个位置,分类讨论:
如果当前字符为 L 且 i<j, 那么这个 L 由于无法向右移动,返回 false;
如果当前字符为 R 且 i>j,那么这个 R 由于无法向左移动,返回 false;
遍历完,若中途没有返回 false 就返回 true。

题解代码:

class Solution {
    public boolean canTransform(String start, String end) {
        int n = start.length();
        int i = 0, j = 0;
        while (true) {
        	//start中x是不影响的,直接跳过所有的x
            while (i < n && start.charAt(i) == 'X') {
                ++i;
            }
            //同理可得
            while (j < n && end.charAt(j) == 'X') {
                ++j;
            }
            //如果都顺利到达字符串的结尾  直接返回true
            if (i == n && j == n) {
                return true;
            }
            //如果有其中一个先到达 或者当前字符串的start的end是不相等的  直接返回false
            if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
                return false;
            }
            //如果L不能想左移动,或者R不能向右移动   直接返回false
            if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
                return false;
            }
            //继续接下来的过程
            ++i;
            ++j;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值