Leetcode移动片段得到字符串

题目描述

实现代码

/**
     * 判断是否可以进行变换
     * @param start 开始字符串
     * @param target 目标字符串
     * @return 可以进行变换返回true,否则返回false
     */
    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++) {
            //start字符遍历到第一个非 _ 的字符  然后再去while遍历target的第一个非 _ 的字符,此时索引j
            //这里可能有点懵,但是好理解,这跟两个循环分别判定没区别,只是这样写代码更加简洁
            if (start.charAt(i) == '_'){
                continue;
            }
            // 跳过目标字符串中的下划线
            while (target.charAt(j) == '_'){
                j++;
            }
            //取到两个字符串分别第一个非 _ 的字符的索引后
            // 比较字符'L'的位置是否满足条件==》如果i!=j,且(字符i为L,且此时i《j)返回false 应该i>=j才true
//            if (i != j && (start.charAt(i) == 'L') == (i < j)){
//                return false;
//            }
            //提问:问什么判断完一次就可以++j了?不用管其他条件了吗?
            /*
            * i=j  不用判断对应的字符相等吗?  不用,因为第一个条件就判断了,证明此时的两个字符中对应的字母顺序都是一样的
            * 此时只有i!=j  在判断start.charAt(i) == 'R'不管吗?  =》不管,此时=L和i<j分别为条件1,2
            * 条件1不变+》条件2变  则true  j++ 所以不管
            * 条件1变  条件2不变, 此时i为R,且i<j  为true  不管  这里也逻辑等价上面那个。
            * 条件1变  条件2也变  此时i为R  且i>=R  也要返回false? 不管,因为逻辑等价,这个点仔细想想
            * */
            //保证好看懂可以写以下
            if (i != j) {
                if (start.charAt(i) == 'L' && i < j) {
                    return false;
                }
                if (start.charAt(i) == 'R' && i > j) {
                    return false;
                }
            }
            ++j;
        }

        // 可以进行变换
        return true;
    }

 参考:

放球问题 质因数分解【力扣周赛 301】LeetCode_哔哩哔哩_bilibili

难点:

1.

去除下划线后比较两个字符串是否相等,不相等返回false,因为根据题意我们可以知道字符移动不能交换L R的位置,只能交换 _ 的位置,所以在去除下划线后如果字符不相等,即fasle

2.

每次遍历每个字符的第一个不为_的字符,

* 如果当前字符为 L 且 i<j,由于 L 由于无法向右移动,返回 false;
* 如果当前字符为 R 且 i>j,由于 R 由于无法向左移动,返回 false。

另外本题用了一个逻辑等价的思想简化了代码,具体看注释:

         //取到两个字符串分别第一个非 _ 的字符的索引后
            // 比较字符'L'的位置是否满足条件==》如果i!=j,且(字符i为L,且此时i《j)返回false 应该i>=j才true
//            if (i != j && (start.charAt(i) == 'L') == (i < j)){
//                return false;
//            }
            //提问:问什么判断完一次就可以++j了?不用管其他条件了吗?
            /*
            * i=j  不用判断对应的字符相等吗?  不用,因为第一个条件就判断了,证明此时的两个字符中对应的字母顺序都是一样的
            * 此时只有i!=j  在判断start.charAt(i) == 'R'不管吗?  =》不管,此时=L和i<j分别为条件1,2
            * 条件1不变+》条件2变  则true  j++ 所以不管
            * 条件1变  条件2不变, 此时i为R,且i<j  为true  不管  这里也逻辑等价上面那个。
            * 条件1变  条件2也变  此时i为R  且i>=R  也要返回false? 不管,因为逻辑等价,这个点仔细想想
            * */
            //保证好看懂可以写以下
            if (i != j) {
                if (start.charAt(i) == 'L' && i < j) {
                    return false;
                }
                if (start.charAt(i) == 'R' && i > j) {
                    return false;
                }
            }

这里可以多借鉴一下思想,以后有用处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值