反向思维

发布时间 2023-08-21 17:38:06作者: adamaik

题目:

给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 'L'、'R' 和 '_' 组成,其中:

字符 'L' 和 'R' 表示片段,其中片段 'L' 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 'R' 只有在其右侧直接存在一个 空位 时才能向 右 移动。
字符 '_' 表示可以被 任意 'L' 或 'R' 片段占据的空位。
如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。

返回true的情况太多,所以我们讨论三种返回false的情况。

  1. 去除_后的字符串不一样
  2. start中的L比target的靠左
  3. strat中的L比target中的靠右

由此可以得到代码:

class Solution {
public:
    bool canChange(string start, string target) {
        string s=start;
        string t=target;
        s.erase(remove(s.begin(),s.end(),'_'),s.end());
        t.erase(remove(t.begin(),t.end(),'_'),t.end());
        if(s!=t)return false;
        int ls=0;int rs=0;
        int lt=0;int rt=0;
        for(int i=0;i<start.size();++i){
            switch(start[i]){
                case 'L':++ls;break;
                case 'R':++rs;
            }
            switch(target[i]){
                case 'L':++lt;break;
                case 'R':++rt;
            }
            if(ls>lt)return false;
            if(rs<rt)return false;
        }
        return true;
    }
};

附属知识点:

  1. image
  2. remove函数源代码:
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val)
{
    ForwardIterator result = first;
    while (first!=last) 
    {
        if (!(*first == val)) 
        {
            *result = move(*first);
            ++result;
        }
        ++first;
    }
    return result;
}
  1. erase三种用法:
    image

  2. string中永久删除某段文字常用函数:s.erase(s.remove(s,begin(),s.end(),'目标'),s.end());