LeetCode——777.在LR字符串中交换相邻字符

大佬,牛!!!

  • 题目:给你两个字符串start和end,然后看看能不能经过一定的变换以后,使得两个字符串相同。其变换就是将start的XL替换成LX,或者是将RX替换成XR。
  • 我的思路:我每次都比对两个字符,如果相同就掉过。但是直到遇到了这个测试"XXXXXLXXXX"、“LXXXXXXXXX”,我才意识到我的思路是错的。但是也没想到其他的办法。
  • 大佬的思路:其实这个题不是很难,但是这个规律比较难找。我当时做的时候就有点钻牛角尖了。然后看了一下大佬的解析,才发现,我的出发点就是错的。其实每次都让L往左移动,让R往右移动。因此需要满足的条件为:
    1. 只要保证L和R的相对顺序相同,以及每个元素的对应个数相同。
    2. 每个L在end中的下标小于等于对应的L在start中的下标,
    3. 每个R在end中的下标大于等于对应的R在start中的下标。
  • 技巧:双指针

java代码

class Solution {
    public boolean canTransform(String start, String end) {
        int n = start.length();
        int i = 0, j = 0;
        while (i < n && j < n) {
            while (i < n && start.charAt(i) == 'X') {
                i++;
            }
            while (j < n && end.charAt(j) == 'X') {
                j++;
            }
            if (i < n && j < n) {
                if (start.charAt(i) != end.charAt(j)) {
                    return false;
                }
                char c = start.charAt(i);
                if ((c == 'L' && i < j) || (c == 'R' && i > j)) {
                    return false;
                }
                i++;
                j++;
            }
        }
        while (i < n) {
            if (start.charAt(i) != 'X') {
                return false;
            }
            i++;
        }
        while (j < n) {
            if (end.charAt(j) != 'X') {
                return false;
            }
            j++;
        }
        return true;
    }
}
  • 总结:题目挺有意思的,我一开始的思路就是偏离了。这里有三个条件,第一个是因为LR或者RL是不能换的,后面两个是要保证单方向的换。最后附上大佬的链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值