头脑风暴

Swap Adjacent in LR String

  • 给定2个string, start and end, 只包含L, X, R char

  • 可以replace "XL" with "LX", replace "RX" with "XR", 求问start 是否能transform成end string

  • 一开始自然的想到了word ladder的思路,给定source and dest求问最短路径

  • 暴力写了个BFS结果TLE了

    • start: "XXRXXXXXXXRXRXXXLXXLXXLXXXXXRXXXXXXXXLXX"

    • end: "XXXRXXXXRXXXXXXRXXXLXXXXXXXLXXLXXRXXLXXX"

class Solution {
    public boolean canTransform(String start, String end) {
        if (start.equals(end)) return true;
        Queue<String> queue = new LinkedList<>();
        Set<String> visited = new HashSet<>();
        queue.offer(start);
        visited.add(start);
        while (!queue.isEmpty()) {
            String cur = queue.poll();
            for (int i = 0; i < cur.length() - 1; i++) {
                if (cur.substring(i, i + 2).equals("XL")) {
                    String next = cur.substring(0, i) + "LX" + cur.substring(i + 2);
                    if (next.equals(end)) return true;
                    if (visited.contains(next)) continue;
                    queue.offer(next);
                    visited.add(next);
                }
                if (cur.substring(i, i + 2).equals("RX")) {
                    String next = cur.substring(0, i) + "XR" + cur.substring(i + 2);
                    if (next.equals(end)) return true;
                    if (visited.contains(next)) continue;
                    queue.offer(next);
                    visited.add(next);
                }
            }
        }
        return false;
    }
}
  • 然后就去Discuss里看了其它答案,发现这题是个数学推演题

  • since we can only move R to the right RX->XR, move L to the left, XL->LX L and R can never cross each other

  • just skip X character and compare position of L and R in 2 strings

  • for start[i] = end[j] = L, check i>=j, 因为 L只能左移

  • start[i] = end[j] = R, check i<=j, 因为R只能右移

  • 转换成了two pointer

  • 这里有个非常tricky的case

    • start:"XXRXLXRXXX"

    • end: "XXRLXXXXXR"

  • 因为end的最后一个char是R, 但是start最后一个R之后还有一堆X, 所以不能简单的写while (p1 < n && p2 < n), 需要特殊处理p1==n和p2==n的情况

Last updated

Was this helpful?