LeetCode 301场周赛 6114. 移动片段得到字符串

题目

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

字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 ‘R’ 只有在其右侧直接存在一个 空位 时才能向 右 移动。
字符 ‘_’ 表示可以被 任意 ‘L’ 或 ‘R’ 片段占据的空位。
如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。

示例 1:

输入:start = "_L__R__R_", target = "L______RR"
输出:true
解释:可以从字符串 start 获得 target ,需要进行下面的移动:
- 将第一个片段向左移动一步,字符串现在变为 "L___R__R_" 。
- 将最后一个片段向右移动一步,字符串现在变为 "L___R___R" 。
- 将第二个片段向右移动散步,字符串现在变为 "L______RR" 。
可以从字符串 start 得到 target ,所以返回 true 。

示例 2:

输入:start = "R_L_", target = "__LR"
输出:false
解释:字符串 start 中的 'R' 片段可以向右移动一步得到 "_RL_" 。
但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target 。

示例 3:

输入:start = "_R", target = "R_"
输出:false
解释:字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target 。

提示:

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

解题思路

这是一道字符串模拟的题,可以用双针针,分别模拟两个字符串的匹配情况,这里关键在于找到两个字符串匹配的充分必要条件。因为L只能向左。R只能向右,因此L之前必须有空位且必须在第二个串之后,相反R之后必须有空位,且在第二个串之前,同时第二个串,之后不能有多余的LR。

代码

class Solution {
    // 双指针
    public boolean canChange(String start, String target) {
        int n = start.length();
        int j = 0;// 枚举第二个串
        for(int i = 0;i < n;i++){
            // 找到第一个串中第一个不为空的字符
            if(start.charAt(i) == '_') continue;
            // 找到第二个串中第一个不为空的字符
            while(j < n && target.charAt(j) == '_') j++;
            // 第二个串到了结尾
            if(j == n) return false;
            if(start.charAt(i) != target.charAt(j)) return false;
            if(start.charAt(i) == 'L' && i < j) return false;
            if(start.charAt(i) == 'R' && i > j) return false;
            // 其他情况表示匹配
            j++;
        }
        // 确保第二个数组之后不含LR
        for(int i = j;j < n;j++){
            if(target.charAt(j) != '_'){
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(leetcode,算法,leetcode,算法)