目录
2337. 移动片段得到字符串
题目描述:
实现代码与解析:
双指针
原理思路:
2337. 移动片段得到字符串
题目描述:
给你两个字符串 start
和 target
,长度均为 n
。每个字符串 仅 由字符 'L'
、'R'
和 '_'
组成,其中:
- 字符
'L'
和'R'
表示片段,其中片段'L'
只有在其左侧直接存在一个 空位 时才能向 左 移动,而片段'R'
只有在其右侧直接存在一个 空位 时才能向 右 移动。 - 字符
'_'
表示可以被 任意'L'
或'R'
片段占据的空位。
如果在移动字符串 start
中的片段任意次之后可以得到字符串 target
,返回 true
;否则,返回 false
。
示例 1:
输入:start = "_L__R__R_", target = "L______RR" 输出:true 解释:可以从字符串 start 获得 target ,需要进行下面的移动: - 将第一个片段向左移动一步,字符串现在变为 "L___R__R_" 。 - 将最后一个片段向右移动一步,字符串现在变为 "L___R___R" 。 - 将第二个片段向右移动散步,字符串现在变为 "L______RR" 。 可以从字符串 start 得到 target ,所以返回 true 。
示例 2:
输入:start = "R_L_", target = "__LR" 输出:false 解释:字符串 start 中的 'R' 片段可以向右移动一步得到 "_RL_" 。 但是,在这一步之后,不存在可以移动的片段,所以无法从字符串 start 得到 target 。
示例 3:
输入:start = "_R", target = "R_" 输出:false 解释:字符串 start 中的片段只能向右移动,所以无法从字符串 start 得到 target 。
提示:
n == start.length == target.length
1 <= n <= 105
-
start
和target
由字符'L'
、'R'
和'_'
组成
实现代码与解析:
双指针
class Solution {
public:
bool canChange(string start, string target) {
int count1 = 0; // 记录两个字符串字母长度
int count2 = 0;
for (int i = 0, j = 0; i < start.size() || j < target.size(); )
{
while (target[j] == '_') j++;
while (start[i] == '_') i++;
if (isalpha(target[j])) count1++;
if (isalpha(start[i])) count2++;
if (start[i] != target[j]) return false; // 不相等
if (target[j] == 'L' && i < j) return false; // 在左侧
if (target[j] == 'R' && i > j) return false; // 在右侧
i++;
j++;
}
if (count1 != count2) return false;
return true;
}
};
原理思路:
知道什么时候不成立就很好写了,L只能向左移动,R只能向右移动,所以我们同时遍历start与target,若对应字母不相同,直接返回false,若相同为L,i < j,i 只能向左移动,不能向右,所以小于时肯定false,同理为R时,i > j,返回false。文章来源:https://www.toymoban.com/news/detail-666450.html
还有测试样例中最后一个,两个字符串中的字母个数不相同,count记录判断一下即可。文章来源地址https://www.toymoban.com/news/detail-666450.html
到了这里,关于Leetcode每日一题:2337. 移动片段得到字符串(2023.8.21 C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!