LC-2237. 移动片段得到字符串(脑经急转弯 双指针)

2337. 移动片段得到字符串

中等

给你两个字符串 starttarget ,长度均为 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
  • starttarget 由字符 'L''R''_' 组成

脑经急转弯

https://leetcode.cn/problems/move-pieces-to-obtain-a-string/solutions/1658923/nao-jin-ji-zhuan-wan-pythonjavacgo-by-en-9sqt/

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[i] == 'L') == (i < j)) return false;
            首先,i == j时,是肯定能满足题目要求的,不然在s != t时,就直接return了,所以无需判断处理。

            其次,(start[i] == 'L') == (i < j) 其实是隐含了R的判断,
            但是start[i]为'R'时,要这个一整个表达式为true,需要左右两侧都是false。
            start[i]为'R',左侧表达式自然是false,那么右侧应该是i >= j才会是false。但如前面所说,i == j是满足题意的,这时候前面这个 i != j就很有必要了。
             */
            if((start.charAt(i) == 'L' && i < j) || (start.charAt(i) == 'R' && i > j)) 
                return false;
            ++j;
        }
        return true;
    }
}

你可能感兴趣的:(算法刷题记录,leetcode)