• 脑筋急转弯6114. 移动片段得到字符串


    问题描述

    给你两个字符串 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' 和 '_' 组成

    问题求解

    由于LR无法互相穿透,因此将_去除后应该是一一对应的,并且L只能向左移动,R只能向右移动,利用这个性质进行判断即可。

    class Solution:
        def canChange(self, start: str, target: str) -> bool:
            start = [[ch, idx] for idx, ch in enumerate(start) if ch != "_"]
            target = [[ch, idx] for idx , ch in enumerate(target) if ch != "_"]
            if len(start) != len(target): return False
            for i in range(len(start)):
                if start[i][0] != target[i][0]: return False
                if start[i][0] == "L" and start[i][1] < target[i][1]: return False
                if start[i][0] == "R" and start[i][1] > target[i][1]: return False
            return True
    
  • 相关阅读:
    ubuntu 升级到5.1kernel,打开bbr
    python json.loads json.dumps的区别
    centos7 install vim8
    Linux的Network Tunnel技术
    Linux内核网络数据包处理流程
    CAD2010 破解方法
    [原创]MSP430FR4133练习(一):GPIO输入电平状态判断
    [原创] Xinput_1.3.DLL / MSVCR100.DLL文件缺失解决办法
    [原创]找不到mswinsck.ocx的解决办法
    Windows7系统推荐
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/16463456.html
Copyright © 2020-2023  润新知