【每日一题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 ′ start[i]== 'L' start[i]==′L′,而 i < j i<j i<j时,返回false,因为'L'不能右移
    • 如果 s t a r t [ i ] = = ′ R ′ start[i]== 'R' start[i]==′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 ′ start[i]== 'L' start[i]==′L′,而 r > 0 r>0 r>0时,返回false,因为R不能移动至L的右边
      • 如果 s t a r t [ i ] = = ′ R ′ start[i]== 'R' start[i]==′R′,而 l < 0 l<0 l<0时,返回false,因为L不能移动至R的左边
      • 如果 t a r g e t [ i ] = = ′ L ′ target[i]== 'L' target[i]==′L′,而 r > 0 r>0 r>0时,返回false,因为R不能移动至L的右边
      • 如果 t a r g e t [ i ] = = ′ R ′ target[i]== 'R' target[i]==′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)
相关推荐
承渊政道9 分钟前
【优选算法】(实战感悟二分查找算法的思想原理)
c++·笔记·学习·算法·leetcode·visual studio code
重生之我是Java开发战士19 分钟前
【递归、搜索与回溯】记忆化搜索:斐波那契数列,不同路径,最长递增子序列,猜数字游戏II,矩阵中最长递增路径
算法·leetcode·深度优先
爱吃涮毛肚的肥肥(暂时吃不了版)28 分钟前
Leetcode——181.超过经理收入的员工
算法·leetcode·职场和发展
Charlie_lll31 分钟前
力扣解题-接雨水
算法·leetcode
We་ct1 小时前
LeetCode 74. 搜索二维矩阵:两种高效解题思路
前端·算法·leetcode·矩阵·typescript·二分查找
_饭团1 小时前
C 语言数据存储全解析:原反补码、大小端与 IEEE 754 浮点数
c语言·数据结构·算法·leetcode·面试·蓝桥杯·学习方法
j_xxx404_1 小时前
力扣--分治(归并排序)算法题II:计算右侧小于当前元素的个数,翻转对(无痛通关困难题)
开发语言·数据结构·c++·算法·leetcode
Storynone1 小时前
【Day30】卡码网:46. 携带研究材料,LeetCode:416. 分割等和子集
python·算法·leetcode
噜啦噜啦嘞好1 小时前
算法篇:二分查找
数据结构·c++·算法·leetcode
季明洵2 小时前
回溯介绍及实战
java·数据结构·算法·leetcode·回溯