2337. 移动片段得到字符串
777. 在LR字符串中交换相邻字符
脑筋急转弯题,这两道都是一样的,只不过换了个符号罢了,'_'换成了'X',其他一样的。
思路:双指针
首先我们举个例子 , 设又start = _L__R__R_, target = L______RR。则有以下性质:
性质1:L和R的个数应该是一样的(去除了‘_’之后)
性质2:因为L只能往左边是'_'的时候移动,R只能往右边是'_'的时候移动。那么对于start[i]和target[j]有以下情况:
①对于L来说:start[i]中的i要满足 >= target[j]中的j。 i>=j。因为当你start[i]是L的时候是要往左边移动才能得到target[j]所对应的L的位置啊。所以你i肯定是>=j的。
②对于R来说:start[i]中的i要满足<=target[j]中的j。i<=j。因为当你start[i]是R的时候是要往右边移动才能得到target[j]所对应的R的位置啊。所以的i肯定是<=j的。
结论:
所以我们这道题可以通过判断以上条件是否满足来做。当遇到start的L的时候,判断当前的i会不会 < target的j,是的话返回false。当遇到start的R的时候,判断当前的i会不会 > target的 j ,会的话返回false。直到遍历完毕。则返回true。
func canChange(start string, target string) bool {
// 性质1
if strings.ReplaceAll(start,"_", "") != strings.ReplaceAll(target,"_", "") {
return false
}
// 性质2
j := 0
for i, c := range start {
if c == '_'{
continue
}
for target[j] == '_' {
j++
}
if c == 'L' {
if i < j {
return false
}
} else if c == 'R' {
if i > j {
return false
}
}
j++
}
return true
}