Leetcode每日一题:2337. 移动片段得到字符串(2023.8.21 C++)

文章讲述了如何通过双指针方法判断给定的两个只包含L,R和_字符的字符串start是否可以通过移动片段转化为target。关键在于处理移动规则和双指针遍历的逻辑。
摘要由CSDN通过智能技术生成

目录

2337. 移动片段得到字符串

题目描述:

实现代码与解析:

双指针

原理思路:


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' 和 '_' 组成

实现代码与解析:

双指针

class Solution {
public:
    bool canChange(string start, string target) {
        
        int count1 = 0; // 记录两个字符串字母长度
        int count2 = 0;

        for (int i = 0, j = 0; i < start.size() || j < target.size(); )
        {
            while (target[j] == '_') j++;
            while (start[i] == '_') i++;
            if (isalpha(target[j])) count1++;
            if (isalpha(start[i])) count2++;
            if (start[i] != target[j]) return false; // 不相等
            if (target[j] == 'L' && i < j) return false; // 在左侧
            if (target[j] == 'R' && i > j) return false; // 在右侧
            i++;
            j++;
        }

        if (count1 != count2) return false;

        return true;  
    }
};

原理思路:

        知道什么时候不成立就很好写了,L只能向左移动,R只能向右移动,所以我们同时遍历start与target,若对应字母不相同,直接返回false,若相同为L,i < j,i 只能向左移动,不能向右,所以小于时肯定false,同理为R时,i > j,返回false。

        还有测试样例中最后一个,两个字符串中的字母个数不相同,count记录判断一下即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cosmoshhhyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值