Check if it is possible to convert one string into another with given constraints in Python

Given two strings containing only characters 'A', 'B', and '#', we need to check if string s can be transformed into string t following these movement rules:

  • 'A' can only move to the left
  • 'B' can only move to the right
  • 'A' and 'B' cannot cross each other
  • '#' represents empty spaces

Approach

The solution involves validating that each character in s can move to its corresponding position in t without violating the movement constraints ?

Algorithm Steps

  • Convert strings to lists for manipulation
  • Check if strings have equal length and character counts
  • For each non-'#' character in s, find its matching position in t
  • Validate movement constraints: 'A' can only move left, 'B' can only move right

Implementation

def can_transform(s, t):
    s = list(s)
    t = list(t)
    
    # Check if lengths are equal
    if len(s) != len(t):
        return False
    
    # Check if character counts match
    if s.count('A') != t.count('A') or s.count('B') != t.count('B'):
        return False
    
    # Check movement constraints
    for i in range(len(s)):
        if s[i] != '#':
            for j in range(len(t)):
                # Found a conflicting character
                if (t[j] != s[i]) and t[j] != '#':
                    return False
                
                # Found matching character
                if t[j] == s[i]:
                    t[j] = '#'  # Mark as used
                    
                    # Check movement constraints
                    if s[i] == 'A' and i < j:  # A trying to move right
                        return False
                    if s[i] == 'B' and i > j:  # B trying to move left
                        return False
                    break
    
    return True

# Test the function
s = "##AB##B"
t = "A###B#B"
result = can_transform(s, t)
print(f"Can transform '{s}' to '{t}': {result}")
Can transform '##AB##B' to 'A###B#B': True

Example Walkthrough

Let's trace through the example step by step ?

def trace_transformation(s, t):
    print(f"Original: s = '{s}', t = '{t}'")
    
    s_list = list(s)
    t_list = list(t)
    
    print(f"Character counts in s: A={s.count('A')}, B={s.count('B')}")
    print(f"Character counts in t: A={t.count('A')}, B={t.count('B')}")
    
    for i, char in enumerate(s_list):
        if char != '#':
            print(f"\nProcessing '{char}' at position {i}")
            for j, target_char in enumerate(t_list):
                if target_char == char:
                    direction = "left" if j < i else "right" if j > i else "same position"
                    print(f"  Found match at position {j} (moving {direction})")
                    
                    if char == 'A' and i < j:
                        print(f"  ERROR: A cannot move right from {i} to {j}")
                        return False
                    if char == 'B' and i > j:
                        print(f"  ERROR: B cannot move left from {i} to {j}")
                        return False
                    
                    t_list[j] = '#'
                    break
    
    print("\nTransformation is valid!")
    return True

s = "##AB##B"
t = "A###B#B"
trace_transformation(s, t)
Original: s = '##AB##B', t = 'A###B#B'
Character counts in s: A=1, B=2
Character counts in t: A=1, B=2

Processing 'A' at position 2
  Found match at position 0 (moving left)

Processing 'B' at position 3
  Found match at position 4 (moving right)

Processing 'B' at position 6
  Found match at position 6 (moving same position)

Transformation is valid!

Key Constraints

Character Allowed Movement Constraint Check
'A' Left only Target position ? Current position
'B' Right only Target position ? Current position
'#' No movement Represents empty space

Conclusion

This algorithm checks string transformation by validating movement constraints for each character. The key insight is that 'A' can only move left and 'B' can only move right, ensuring no character violates its directional constraint.

---
Updated on: 2026-03-25T15:09:21+05:30

261 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements