国慶節には家に帰るつもりだったのですが、風邪をひいてしまいました。。。
どうしようもない、杭州に残って質問を書くことしかできない
トピックのリンクと説明
https://leetcode.cn/problems/swap-adjacent-in-lr-string/
「L」、「R」、および「X」文字の文字列内で移動します (例: 「RXXLRXRXL」)。移動操作とは、「XL」を「LX」に置き換えたり、「RX」を「XR」に置き換えたりすることを指します。ここで、開始文字列 start と終了文字列 end を指定して、start を end に変換できる一連の移動操作がある場合にのみ、True を返すコードを記述してください。
例 :
入力: start = "RXXLRXRXL"、end = "XRLXXRRLX"
出力: True
説明:
次の手順で開始から終了を変換できます:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX
ヒント:
1 <= len(開始) = len(終了) <= 10000。
start と end の文字列は「L」、「R」、「X」に限定されます。
キーワード: ダブルポインタ
方法 1: ダブル ポインター
スクリーンショットを実行する
コード
public boolean canTransform(String start, String end) {
// XL -> LX
// RX -> XR
// 首先长度剪枝
if (start.length() != end.length()) {
return false;
}
int n = start.length(); ;
// 然后分别两个指针对start 、 end 遍历
for (int startIndex = 0, endIndex = 0; ; startIndex++, endIndex++) {
// 找到start 非X的字符
while (startIndex < n && start.charAt(startIndex) == 'X') {
++startIndex;
}
// 找到end 非X的字符
while (endIndex < n && end.charAt(endIndex) == 'X') {
++endIndex;
}
// 如果都遍历完了就结束成功
if (startIndex == n && endIndex == n) {
return true;
}
// 如果遍历完了,最后还不等
if (startIndex == n || endIndex == n || start.charAt(startIndex) != end.charAt(endIndex)) {
return false;
}
// 如果遍历到L 开始小于结束的索引下标(因为只能往左移)和 R 开始大于结束索引下标(只能右移)
if (start.charAt(startIndex) == 'L' && startIndex < endIndex || start.charAt(startIndex) == 'R' && startIndex > endIndex) {
return false;
}
}
}
終わり
コメント エリアでのコミュニケーション、毎日チェックイン、お急ぎください。!!