@@ -36,22 +36,130 @@ XRLXXRRLX
36
36
37
37
<!-- 这里可写通用的实现逻辑 -->
38
38
39
+ ** 方法一:双指针**
40
+
41
+ 替换操作可以实际上是将 ` L ` 往左移动(` L ` 左边为 ` X ` 时才能移动),` R ` 往右移动(` R ` 右边是 ` X ` 时才能移动),但 ` L ` 无法穿过 ` R ` 。所以,如果去掉 ` start ` 和 ` end ` 中的所有 ` X ` ,剩下的字符应该时相同的,否则返回 ` false ` 。
42
+
43
+ 双指针遍历 ` start ` 和 ` end ` :
44
+
45
+ - 如果当前字符为 ` L ` 且 $i\lt j$,那么这个 ` L ` 无法向右移动,返回 ` false ` ;
46
+ - 如果当前字符为 ` R ` 且 $i\gt j$,那么这个 ` R ` 无法向左移动,返回 ` false ` 。
47
+
48
+ 如果双指针均遍历到末尾,返回 ` true ` 。
49
+
50
+ 时间复杂度 $O(n)$,其中 $n$ 表示字符串 ` start ` 或 ` end ` 的长度。
51
+
52
+ 相似题目:[ 2337. 移动片段得到字符串] ( /solution/2300-2399/2337.Move%20Pieces%20to%20Obtain%20a%20String/README.md )
53
+
39
54
<!-- tabs:start -->
40
55
41
56
### ** Python3**
42
57
43
58
<!-- 这里可写当前语言的特殊实现逻辑 -->
44
59
45
60
``` python
46
-
61
+ class Solution :
62
+ def canTransform (self , start : str , end : str ) -> bool :
63
+ n = len (start)
64
+ i = j = 0
65
+ while 1 :
66
+ while i < n and start[i] == ' X' :
67
+ i += 1
68
+ while j < n and end[j] == ' X' :
69
+ j += 1
70
+ if i >= n and j >= n:
71
+ return True
72
+ if i >= n or j >= n or start[i] != end[j]:
73
+ return False
74
+ if start[i] == ' L' and i < j:
75
+ return False
76
+ if start[i] == ' R' and i > j:
77
+ return False
78
+ i, j = i + 1 , j + 1
47
79
```
48
80
49
81
### ** Java**
50
82
51
83
<!-- 这里可写当前语言的特殊实现逻辑 -->
52
84
53
85
``` java
86
+ class Solution {
87
+ public boolean canTransform (String start , String end ) {
88
+ int n = start. length();
89
+ int i = 0 , j = 0 ;
90
+ while (true ) {
91
+ while (i < n && start. charAt(i) == ' X' ) {
92
+ ++ i;
93
+ }
94
+ while (j < n && end. charAt(j) == ' X' ) {
95
+ ++ j;
96
+ }
97
+ if (i == n && j == n) {
98
+ return true ;
99
+ }
100
+ if (i == n || j == n || start. charAt(i) != end. charAt(j)) {
101
+ return false ;
102
+ }
103
+ if (start. charAt(i) == ' L' && i < j || start. charAt(i) == ' R' && i > j) {
104
+ return false ;
105
+ }
106
+ ++ i;
107
+ ++ j;
108
+ }
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### ** C++**
114
+
115
+ ``` cpp
116
+ class Solution {
117
+ public:
118
+ bool canTransform(string start, string end) {
119
+ int n = start.size();
120
+ int i = 0, j = 0;
121
+ while (true) {
122
+ while (i < n && start[ i] == 'X') ++i;
123
+ while (j < n && end[ j] == 'X') ++j;
124
+ if (i == n && j == n) return true;
125
+ if (i == n || j == n || start[ i] != end[ j] ) return false;
126
+ if (start[ i] == 'L' && i < j) return false;
127
+ if (start[ i] == 'R' && i > j) return false;
128
+ ++i;
129
+ ++j;
130
+ }
131
+ }
132
+ };
133
+ ```
54
134
135
+ ### **Go**
136
+
137
+ ```go
138
+ func canTransform(start string, end string) bool {
139
+ n := len(start)
140
+ i, j := 0, 0
141
+ for {
142
+ for i < n && start[i] == 'X' {
143
+ i++
144
+ }
145
+ for j < n && end[j] == 'X' {
146
+ j++
147
+ }
148
+ if i == n && j == n {
149
+ return true
150
+ }
151
+ if i == n || j == n || start[i] != end[j] {
152
+ return false
153
+ }
154
+ if start[i] == 'L' && i < j {
155
+ return false
156
+ }
157
+ if start[i] == 'R' && i > j {
158
+ return false
159
+ }
160
+ i, j = i+1, j+1
161
+ }
162
+ }
55
163
```
56
164
57
165
### ** ...**
0 commit comments