题目:
给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 'L'、'R' 和 '_' 组成,其中:
字符 'L' 和 'R' 表示片段,其中片段 'L' 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 'R' 只有在其右侧直接存在一个 空位 时才能向 右 移动。
字符 '_' 表示可以被 任意 'L' 或 'R' 片段占据的空位。
如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。
返回true的情况太多,所以我们讨论三种返回false的情况。
- 去除_后的字符串不一样
- start中的L比target的靠左
- 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;
}
};
附属知识点:
- :
- 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;
}
-
erase三种用法:
-
string中永久删除某段文字常用函数:
s.erase(s.remove(s,begin(),s.end(),'目标'),s.end());