【每日一题】在LR字符串中交换相邻字符

发布于:2022-12-03 ⋅ 阅读:(193) ⋅ 点赞:(0)

在LR字符串中交换相邻字符

题目链接

题目描述:

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

示例 :

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

思路分析:
这道题一定要仔细阅读题目,不然很容易就会看错:只能用LX替换XL或者用XR替换RX

通过分析得知,这种替换不会影响L和R的相对顺序(可以举个例子去掉X字符看看结果),而且start中R字符的位置一定<=end中R字符的位置,start中L字符的位置一定>=end中R字符的位置。

那么我们就可以用双指针的办法,用ij遍历start和end,遇到X字符就跳过。
1️⃣ 如果两个字符不相等,就返回false。
2️⃣ 如果两个字符相等,就判断相对顺序,不满足条件就返回false。
3️⃣ 最后还要加一个条件,因为会出现有一个字符串还买遍历完的情况,后边的字符必须全部为X,不是就返回false。

class Solution {
public:
    bool canTransform(string start, string end) {
        int sz = start.size();
        int i = 0, j = 0;
        while(i < sz && j < sz)
        {
            // 跳过X
            while(i < sz && start[i] == 'X')
            {
                i++;
            }
            while(j < sz && end[j] == 'X')
            {
                j++;
            }
            // 判断字符是否相等
            if(i < sz && j < sz)
            {
                if(start[i] != end[j])
                {
                    return false;
                }
                else// 判断与X的相对顺序
                {
                    if(start[i] == 'L' && i < j)
                    {
                        return false;
                    }
                    if(start[i] == 'R' && i > j)
                    {
                        return false;
                    }
                }
                i++;
                j++;
            }
        }
        // 出循环后后边必须全为X
        while(i < sz)
        {
            if(start[i] != 'X')
            {
                return false;
            }
            i++;
        }
        while(j < sz)
        {
            if(end[j] != 'X')
            {
                return false;
            }
            j++;
        }
        return true;
    }
};


纸上得来终觉浅,绝知此事要躬行。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到