记录每日LeetCode 14、在LR字符串中交换相邻字符 Java实现

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

初始代码:

class Solution {
    public boolean canTransform(String start, String end) {
       
    }
}

实例:

输入: start = "RXXLRXRXL", end = "XRLXXRRLX"
输出: True
解释:
我们可以通过以下几步将start转换成end:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX

思路:第一次读完题目可能会觉得是两两交换即可(我是这么简单的被骗的)。但其实并不是如此。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。这句话是表明:如果X在L的相邻左侧,L在X的相邻右侧,那么两两交换,XR也是如此。既然如此,第一思路就是如果两字符串长度不相同,那么无论怎么交换都不可能相同。start和end两个字符串的每一种字符数量相同。第二就是每个'L'在end字符串中的下标小于等于在start字符串的下标,每个'R'在end字符串中的下标大于等于在start字符串的下标。

参考答案:

class Solution {
    public boolean canTransform(String start, String end) {
        if(start.length() != end.length()) return false;
        char[] c1 = start.toCharArray();
        char[] c2 = end.toCharArray();
        //双指针分别表示c1和c2数组的下标
        int p1 = 0,p2 = 0;
        while(p1 < c1.length && p2 < c1.length){
            while(p1 < c1.length && c1[p1] == 'X'){
                p1++;
            }
            while(p2 < c1.length && c2[p2] == 'X'){
                p2++;
            }
            //如果两个指针遍历到数组的最后一个元素即返回true
            if(p1 == p2 && p1 == c1.length) return true;
            if(p1 == c1.length || p2 == c2.length || c1[p1] != c2[p2]) return false;
            if(c1[p1] == 'L'){
                if(p1 < p2) return false;            
            }else if(p1 > p2) return false;
            p1++;
            p2++;
        }
        for(int i = p1;i < c1.length;i++){
            if(c1[i] != 'X') return false;
        }
        for(int i = p2;i < c1.length;i++){
            if(c2[i] != 'X') return false;
        }
        return true;
    }
}

你可能感兴趣的:(LeetCode,java,leetcode)