【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分

移动片段得到字符串【LC2337】

给你两个字符串 starttarget ,长度均为 n 。每个字符串 由字符 'L''R''_' 组成,其中:

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

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

双指针

  • 思路

    如果start进行移动可以的带target,那么将""替换为""后,两个字符串一定相等。由于'L'只能左移,'R'只能右移,那么可以使用双指针 i i i、 j j j定位字符串starttarget中不是''的位置

    • 如果 s t a r t i = = ′ L ′ starti== 'L' starti==′L′,而 i < j i<j i<j时,返回false,因为'L'不能右移
    • 如果 s t a r t i = = ′ R ′ starti== 'R' starti==′R′,而 i > j i>j i>j时,返回false,因为'R'不能左移
  • 实现

    java 复制代码
    class Solution {
        public boolean canChange(String start, String target) {
            if (!start.replaceAll("_", "").equals(target.replaceAll("_", "")))
                return false;
            for (int i = 0, j = 0; i < start.length(); i++) {
                if (start.charAt(i) == '_') continue;
                while (target.charAt(j) == '_')
                    j++;
                if (i != j && (start.charAt(i) == 'L') == (i < j))
                    return false;
                ++j;
            }
            return true;
        }
    }
    
    作者:灵茶山艾府
    链接:https://leetcode.cn/problems/move-pieces-to-obtain-a-string/solutions/1658923/nao-jin-ji-zhuan-wan-pythonjavacgo-by-en-9sqt/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    • 复杂度
      • 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
      • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)

计分

  • 思路

    • start中的'L'和'R'记为1分,target中'L'和'R'记为-1分
    • 由于L和R不能相互穿透,即L不能移动至R的右边,R不能移动至L的左边,当出现以下情况时返回false
      • 如果 s t a r t i = = ′ L ′ starti== 'L' starti==′L′,而 r > 0 r>0 r>0时,返回false,因为R不能移动至L的右边
      • 如果 s t a r t i = = ′ R ′ starti== 'R' starti==′R′,而 l < 0 l<0 l<0时,返回false,因为L不能移动至R的左边
      • 如果 t a r g e t i = = ′ L ′ targeti== 'L' targeti==′L′,而 r > 0 r>0 r>0时,返回false,因为R不能移动至L的右边
      • 如果 t a r g e t i = = ′ R ′ targeti== 'R' targeti==′R′,而 l < 0 l<0 l<0时,返回false,因为L不能移动至R的左边
      • 如果 l > 0 l>0 l>0或者 r < 0 r<0 r<0时,返回false,start中最左端有L或者最右端有R
  • 实现

    java 复制代码
    class Solution {
        public boolean canChange(String start, String target) {
           int l = 0, r = 0;
           int n = start.length();
           for (int i = 0; i < n; i++){
               if (start.charAt(i) == 'L'){
                   if (r > 0) return false;
                   l++;
               }else if (start.charAt(i) == 'R'){
                   if (l < 0) return false;
                   r++;
               }
               if (target.charAt(i) == 'L'){
                   if (r > 0) return false;
                   l--;
               }else if (target.charAt(i) == 'R'){
                   if (l < 0) return false;
                   r--;
               }
               if (l > 0 || r < 0) return false;
           }
           return l == 0 && r == 0;
           
        }
    }
    • 复杂度
      • 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
      • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)
相关推荐
evans在进步2 小时前
LeetCode 64:最小路径和——Java 原地动态规划详解
java·leetcode·动态规划
Tisfy2 小时前
LeetCode 1386.安排电影院座位:哈希表+位运算
算法·leetcode·散列表·题解·哈希表
Nil2083 小时前
leetcode 199二叉树的右视图
算法·leetcode·深度优先
土司大王8 小时前
LeetCode hot100——两两交换链表中的节点
算法·leetcode·职场和发展
zander2589 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
欧叶冲冲冲9 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
圣保罗的大教堂10 小时前
leetcode 3622. 判断整除性 简单
leetcode
Lyyaoo.11 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
圣保罗的大教堂12 小时前
leetcode 2996. 大于等于顺序前缀和的最小缺失整数 简单
leetcode
圣保罗的大教堂12 小时前
leetcode 3702. 按位异或非零的最长子序列 中等
leetcode