<p>In a string composed of <code>&#39;L&#39;</code>, <code>&#39;R&#39;</code>, and <code>&#39;X&#39;</code> characters, like <code>&quot;RXXLRXRXL&quot;</code>, a move consists of either replacing one occurrence of <code>&quot;XL&quot;</code> with <code>&quot;LX&quot;</code>, or replacing one occurrence of <code>&quot;RX&quot;</code> with <code>&quot;XR&quot;</code>. Given the starting string <code>start</code> and the ending string <code>end</code>, return <code>True</code> if and only if there exists a sequence of moves to transform <code>start</code> to <code>end</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> start = &quot;RXXLRXRXL&quot;, end = &quot;XRLXXRRLX&quot;
<strong>Output:</strong> true
<strong>Explanation:</strong> We can transform start to end following these steps:
RXXLRXRXL -&gt;
XRXLRXRXL -&gt;
XRLXRXRXL -&gt;
XRLXXRRXL -&gt;
XRLXXRRLX
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> start = &quot;X&quot;, end = &quot;L&quot;
<strong>Output:</strong> false
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= start.length&nbsp;&lt;= 10<sup>4</sup></code></li>
	<li><code>start.length == end.length</code></li>
	<li>Both <code>start</code> and <code>end</code> will only consist of characters in <code>&#39;L&#39;</code>, <code>&#39;R&#39;</code>, and&nbsp;<code>&#39;X&#39;</code>.</li>
</ul>

class Solution {
public:
    bool canTransform(string start, string end) {
    bool flag = false;
        for(int i=0;i<start.size()-1;i++) {
            if(start[i] == 'X' && start[i+1] == 'L') flag = true;
            if(start[i] == 'R' && start[i+1] == 'X') flag = true;
        }
    if(!flag) return start == end;
    int n = start.size();

    string s_filtered = "", e_filtered = "";
    for (char c : start) if (c != 'X') s_filtered += c;
    for (char c : end) if (c != 'X') e_filtered += c;

    if (s_filtered != e_filtered) return false;

    int i = 0, j = 0;

    while (i < n && j < n) {
        while (i < n && start[i] != 'R') i++;
        while (j < n && end[j] != 'R') j++;

        if (i == n || j == n) break;

        if (i > j) return false;

        i++;
        j++;
    }

    i = 0, j = 0;

    while (i < n && j < n) {
        while (i < n && start[i] != 'L') i++;
        while (j < n && end[j] != 'L') j++;

        if (i == n || j == n) break;

        if (i < j) return false;

        i++;
        j++;
    }

    return true;
}

};
9500