每日一题 | 2022-10-2 | 2337. 移动片段得到字符串 | 777. 在LR字符串中交换相邻字符 | Goland |

2337. 移动片段得到字符串

777. 在LR字符串中交换相邻字符

脑筋急转弯题,这两道都是一样的,只不过换了个符号罢了,'_'换成了'X',其他一样的。

 思路:双指针

        首先我们举个例子 , 设又start = _L__R__R_,   target = L______RR。则有以下性质:

性质1:L和R的个数应该是一样的(去除了‘_’之后)

性质2:因为L只能往左边是'_'的时候移动,R只能往右边是'_'的时候移动。那么对于start[i]和target[j]有以下情况:

        ①对于L来说:start[i]中的i要满足 >= target[j]中的j。 i>=j。因为当你start[i]是L的时候是要往左边移动才能得到target[j]所对应的L的位置啊。所以你i肯定是>=j的。

        ②对于R来说:start[i]中的i要满足<=target[j]中的j。i<=j。因为当你start[i]是R的时候是要往右边移动才能得到target[j]所对应的R的位置啊。所以的i肯定是<=j的。

结论:

        所以我们这道题可以通过判断以上条件是否满足来做。当遇到start的L的时候,判断当前的i会不会 < target的j,是的话返回false。当遇到start的R的时候,判断当前的i会不会 > target的 j ,会的话返回false。直到遍历完毕。则返回true。

func canChange(start string, target string) bool {
    // 性质1
    if strings.ReplaceAll(start,"_", "") != strings.ReplaceAll(target,"_", "") {
        return false
    }
    
    // 性质2
    j := 0
    for i, c := range start {  
        if c == '_'{
            continue
        }
        for target[j] == '_' {
            j++
        }
        
        if c == 'L' {
            if i < j {
                return false
            }
        } else if c == 'R' {
            if i > j {
                return false
            }
        }
        j++
        
    }
    return true
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值