777. Swap Adjacent in LR String - cocoder39/coco39_LC GitHub Wiki
777. Swap Adjacent in LR String
XL->LX:XXXL->LXXXRX->XR:RXXX->XXXR
Thinking process:
- 
- start.replace('X', '') != end.replace('X', '') ensures L and R align in sequence and count in the 2 strings
 
 - 
- now we want to insert X properly such that start can transform to end
 
- when inserting a X to left of L in start, then a X should be inserted to right of the matching L in end
 - when inserting a X to right of R in start, then a X should be inserted to left of the matching R in end
 
 - 3: len(start) == len(end) so equal length of X are inserted into start and end
 
class Solution:
    def canTransform(self, start: str, end: str) -> bool:
        # if can transform, then string with X removed should be same 
        # this ensures L and R align in sequence and count  
        # "RXR" -> "XXR"       
        if start.replace('X', '') != end.replace('X', ''):
            return False
        i, j = 0, 0
        n = len(start)
        # ensure L and R adheres to the movement constraints
        # L can only move left and R can only move right
        while i < n and j < n:
            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:
                return False
            
            if start[i] != end[j]:
                return False
            
            # RXX -> XRX -> XXR
            if start[i] == 'R' and i > j:
                return False
            
            # XXL -> XLX -> LXX 
            if start[i] == 'L' and i < j:
                return False
            i += 1
            j += 1
        # we reach here only if at least one string has been processed
        # as we have validated the 2 strings has L and R align in sequence and count, this means we have processed all L and R in the other string
        # there could be extra X in the other string, but string1 and string2 have equal length so there is at most one extra R in the other string
        return True