列表

详情


2337. 移动片段得到字符串

给你两个字符串 starttarget ,长度均为 n 。每个字符串 由字符 '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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool canChange(string start, string target) { } };

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

上一题