返回介绍

solution / 0700-0799 / 0777.Swap Adjacent in LR String / README

发布于 2024-06-17 01:03:34 字数 4540 浏览 0 评论 0 收藏 0

777. 在 LR 字符串中交换相邻字符

English Version

题目描述

在一个由 'L' , 'R''X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True

 

示例 :

输入: start = "RXXLRXRXL", end = "XRLXXRRLX"
输出: True
解释:
我们可以通过以下几步将start转换成end:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX

 

提示:

  • 1 <= len(start) = len(end) <= 10000
  • startend中的字符串仅限于'L', 'R''X'

解法

方法一:双指针

替换操作实际上是将 L 往左移动(L 左边为 X 时才能移动),R 往右移动(R 右边是 X 时才能移动),但 L 无法穿过 R。所以,如果去掉 startend 中的所有 X,剩下的字符应该是相同的,否则返回 false

双指针遍历 startend

  • 如果当前字符为 L 且 $i\lt j$,那么这个 L 无法向右移动,返回 false
  • 如果当前字符为 R 且 $i\gt j$,那么这个 R 无法向左移动,返回 false

如果双指针均遍历到末尾,返回 true

时间复杂度 $O(n)$,其中 $n$ 表示字符串 startend 的长度。

相似题目:

class Solution:
  def canTransform(self, start: str, end: str) -> bool:
    n = len(start)
    i = j = 0
    while 1:
      while i < n and start[i] == 'X':
        i += 1
      while j < n and end[j] == 'X':
        j += 1
      if i >= n and j >= n:
        return True
      if i >= n or j >= n or start[i] != end[j]:
        return False
      if start[i] == 'L' and i < j:
        return False
      if start[i] == 'R' and i > j:
        return False
      i, j = i + 1, j + 1
class Solution {
  public boolean canTransform(String start, String end) {
    int n = start.length();
    int i = 0, j = 0;
    while (true) {
      while (i < n && start.charAt(i) == 'X') {
        ++i;
      }
      while (j < n && end.charAt(j) == 'X') {
        ++j;
      }
      if (i == n && j == n) {
        return true;
      }
      if (i == n || j == n || start.charAt(i) != end.charAt(j)) {
        return false;
      }
      if (start.charAt(i) == 'L' && i < j || start.charAt(i) == 'R' && i > j) {
        return false;
      }
      ++i;
      ++j;
    }
  }
}
class Solution {
public:
  bool canTransform(string start, string end) {
    int n = start.size();
    int i = 0, j = 0;
    while (true) {
      while (i < n && start[i] == 'X') ++i;
      while (j < n && end[j] == 'X') ++j;
      if (i == n && j == n) return true;
      if (i == n || j == n || start[i] != end[j]) return false;
      if (start[i] == 'L' && i < j) return false;
      if (start[i] == 'R' && i > j) return false;
      ++i;
      ++j;
    }
  }
};
func canTransform(start string, end string) bool {
  n := len(start)
  i, j := 0, 0
  for {
    for i < n && start[i] == 'X' {
      i++
    }
    for j < n && end[j] == 'X' {
      j++
    }
    if i == n && j == n {
      return true
    }
    if i == n || j == n || start[i] != end[j] {
      return false
    }
    if start[i] == 'L' && i < j {
      return false
    }
    if start[i] == 'R' && i > j {
      return false
    }
    i, j = i+1, j+1
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文