2023-08-21 LeetCode每日一题(移动片段得到字符串)

2023-08-21每日一题

一、题目编号

2337. 移动片段得到字符串

二、题目链接

点击跳转到题目位置

三、题目描述

给你两个字符串 start 和 target ,长度均为 n 。每个字符串 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中:

  • 字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 移动,而片段 ‘R’ 只有在其右侧直接存在一个 空位 时才能向 右 移动。
  • 字符 ‘_’ 表示可以被 任意 ‘L’ 或 ‘R’ 片段占据的空位。

如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。

示例 1:
2023-08-21 LeetCode每日一题(移动片段得到字符串)_第1张图片

示例 2:
在这里插入图片描述
示例 3:
在这里插入图片描述
提示:

  • n == start.length == target.length
  • 1 <= n <= 105
  • start 和 target 由字符 ‘L’、‘R’ 和 ‘_’ 组成

四、解题代码

class Solution {
public:
    bool canChange(string start, string target) {
        int n = start.size();
        int i = 0;
        int j = 0;
        while(i < n && j < n){
            while(i < n && start[i] == '_'){
                ++i;
            }
            while(j < n && target[j] == '_'){
                ++j;
            }
            if(i < n && j < n){
                if(start[i] != target[j]){
                    return false;
                } 
                if(start[i] == 'L' && i < j){
                    return false;
                }
                if(start[i] == 'R' && i > j){
                    return false;
                }
                ++i;
                ++j;
            }
        }
        while(i < n){
            if(start[i] != '_'){
                return false;
            }
            ++i;
        }
        while(j < n){
            if(target[j] != '_'){
                return false;
            }
            ++j;
        }
    return true;
    }
};

五、解题思路

(1) 我们是将start转化成target的,所以target是不动的,将start转化成target。

(2) 如果转化要成功,必须确保start和target中的相应字符数目要相等。

(3) 我们跳过start和target中的‘_’字符,如果此时start和target中遍历到的字符不相同,那么代表不能转变,如果同为’L’,那么start中的下标必须大于等于target中的下标,不然不能移动。如果同为‘R’,那么start中的下标必须小于等于target中的下标,不然不能移动。

(4) 最后判断是否对应字符数目相等,因为有可能一个字符串已经遍历到最后了,另一个字符串还没有,这个时候继续遍历没有遍历完的字符串,如果还有其他的字符,则表示错误。

(5) 如果上述条件全部满足了,返回true即可。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)