链接:https://leetcode.cn/problems/swap-adjacent-in-lr-string/solution/-by-xun-ge-v-w3b9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
思路
根据题意,我们每次移动要么是将 XL 变为 LX,要么是将 RX 变为 XR,而该两者操作可分别看做将 L 越过多个 X 向左移动,将 R 越过多个 X 向右移动。
因此在 start 和 end 中序号相同的 L 和 R 必然满足坐标性质:
- 序号相同的 L : start 的下标不小于 end 的下标(即 L 不能往右移动)
- 序号相同的 R : start 的下标不大于 end 的下标(即 R 不能往左移动)
其中「序号」是指在 LR 字符串中出现的相对顺序。
代码
bool canTransform(char * start, char * end) {
int n = strlen(start);
int i = 0, j = 0;
while (i < n || j < n) {
while (i < n && start[i] == 'X') i++;
while (j < n && end[j] == 'X') j++;//对于x可以直接不处理
if (i == n || j == n) return i == j;//到末尾了,如果都到末尾说明元素个数一样可以换到最后
if (start[i] != end[j]) return false;//如果不一样说明L或者R的相对位置不一样
if (start[i] == 'L' && i < j) return false;//一样则相对位置需要一样
if (start[i] == 'R' && i > j) return false;
i++; j++;
}
return i == j;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/swap-adjacent-in-lr-string/solution/-by-xun-ge-v-w3b9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。