class Solution {
public:
bool canChange(string start, string target) {
}
};
2337. 移动片段得到字符串
给你两个字符串 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'
和 '_'
组成原站题解
java 解法, 执行用时: 132 ms, 内存消耗: 45.1 MB, 提交时间: 2023-08-21 09:25:43
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; } }
javascript 解法, 执行用时: 132 ms, 内存消耗: 50.1 MB, 提交时间: 2023-08-21 09:25:21
/** * @param {string} start * @param {string} target * @return {boolean} */ var canChange = function (start, target) { if (start.replaceAll('_', '') !== target.replaceAll('_', '')) return false; let j = 0; for (let i = 0; i < start.length; i++) { if (start[i] === '_') continue; while (target[j] === '_') j++; if (i !== j && (start[i] === 'L') === (i < j)) return false; j++; } return true; };
golang 解法, 执行用时: 56 ms, 内存消耗: 6.6 MB, 提交时间: 2023-08-21 09:25:03
func canChange(start, target string) bool { if strings.ReplaceAll(start, "_", "") != strings.ReplaceAll(target, "_", "") { return false } j := 0 for i, c := range start { if c != '_' { for target[j] == '_' { j++ } // c = 'L' i < j 由于L不能穿越R;c = 'R' i > j 由于R不能穿越L if i != j && c == 'L' == (i < j) { return false } j++ } } return true }
python3 解法, 执行用时: 156 ms, 内存消耗: 16.9 MB, 提交时间: 2023-08-21 09:20:49
class Solution: def canChange(self, start: str, target: str) -> bool: if start.replace('_', '') != target.replace('_', ''): return False j = 0 for i, c in enumerate(start): if c == '_': continue while target[j] == '_': j += 1 if i != j and (c == 'L') != (i > j): return False j += 1 return True