2023-08-21每日一题
一、题目编号
2337. 移动片段得到字符串
二、题目链接
点击跳转到题目位置
三、题目描述
给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中:
- 字符 ‘L’ 和 ‘R’ 表示片段,其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段 ‘R’ 只有在其右侧直接存在一个 空位 时才能向 右 移动。
- 字符 ‘_’ 表示可以被 任意 ‘L’ 或 ‘R’ 片段占据的空位。
如果在移动字符串 start 中的片段任意次之后可以得到字符串 target ,返回 true ;否则,返回 false 。
示例 1:
示例 2:
示例 3:
提示:
- n == start.length == target.length
- 1 <= n <= 105
- start 和 target 由字符 ‘L’、‘R’ 和 ‘_’ 组成
四、解题代码
class Solution {
public:
bool canChange(string start, string target) {
int n = start.size();
int i = 0;
int j = 0;
while(i < n && j < n){
while(i < n && start[i] == '_'){
++i;
}
while(j < n && target[j] == '_'){
++j;
}
if(i < n && j < n){
if(start[i] != target[j]){
return false;
}
if(start[i] == 'L' && i < j){
return false;
}
if(start[i] == 'R' && i > j){
return false;
}
++i;
++j;
}
}
while(i < n){
if(start[i] != '_'){
return false;
}
++i;
}
while(j < n){
if(target[j] != '_'){
return false;
}
++j;
}
return true;
}
};
五、解题思路
(1) 我们是将start转化成target的,所以target是不动的,将start转化成target。
(2) 如果转化要成功,必须确保start和target中的相应字符数目要相等。
(3) 我们跳过start和target中的‘_’字符,如果此时start和target中遍历到的字符不相同,那么代表不能转变,如果同为’L’,那么start中的下标必须大于等于target中的下标,不然不能移动。如果同为‘R’,那么start中的下标必须小于等于target中的下标,不然不能移动。
(4) 最后判断是否对应字符数目相等,因为有可能一个字符串已经遍历到最后了,另一个字符串还没有,这个时候继续遍历没有遍历完的字符串,如果还有其他的字符,则表示错误。
(5) 如果上述条件全部满足了,返回true即可。