国慶節でもリートコード 777 の混乱が止まらない。LR 文字列内の隣接する文字を交換する

国慶節には家に帰るつもりだったのですが、風邪をひいてしまいました。

どうしようもない、杭州に残って質問を書くことしかできない

ここに画像の説明を挿入

トピックのリンクと説明

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;
			}
		}
	}


終わり

コメント エリアでのコミュニケーション、毎日チェックイン、お急ぎください。

おすすめ

転載: blog.csdn.net/qq_35530042/article/details/127139806