在一個由 ‘L’ , ‘R’ 和 ‘X’ 三個字符組成的字符串(例如"RXXLRXRXL")中進行移動操作。一次移動操作指用一個 “LX” 替換一個 “XL”,或者用一個 “XR” 替換一個 “RX”。現給定起始字符串 start 和結束字符串 result,請編寫代碼,當且僅當存在一系列移動操作使得 start 可以轉換成 result 時, 返回 True。
示例 1:
輸入:start = “RXXLRXRXL”, result = “XRLXXRRLX”
輸出:true
解釋:通過以下步驟我們可以將 start 轉化為 result:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX
示例 2:
輸入:start = “X”, result = “L”
輸出:false
提示:
1 <= start.length <= 104^44
start.length == result.length
start 和 result 都只包含 ‘L’, ‘R’ 或 ‘X’。
start和result去掉X字符后,剩余部分應該相同,L字符只能往左移動,R字符只能往右移動,雙指針遍歷,遇到不滿足的條件返回false即可:
class Solution {
public:bool canTransform(string start, string result) {int n = start.size();int startIdx = 0;int resultIdx = 0;while (startIdx < n && resultIdx < n) {if (start[startIdx] == 'X') {++startIdx;continue;}if (result[resultIdx] == 'X') {++resultIdx;continue;}// 字符不同 ||// 字符是L,但向右移動 ||// 字符是R,但向左移動if (start[startIdx] != result[resultIdx] ||startIdx < resultIdx && start[startIdx] == 'L' ||startIdx > resultIdx && start[startIdx] == 'R') {return false;}++startIdx;++resultIdx;}// 以上循環結束時,可能start沒有遍歷完,或result沒有遍歷完// 如果start沒有遍歷完,且未遍歷部分有非X字符,說明result里的非X字符少了while (startIdx < n) {if (start[startIdx] != 'X') {return false;}++startIdx;}// 如果result沒有遍歷完,且未遍歷部分有非X字符,說明result里的非X字符多了while (resultIdx < n) {if (result[resultIdx] != 'X') {return false;}++resultIdx;}return true;}
};
如果start的長度為n,則此算法時間復雜度為O(n),空間復雜度為O(1)。