[LeetCode] 777. 在LR字符串中交换相邻字符

在一个由 'L' , 'R''X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个"LX"替换一个"XL",或者用一个"XR"替换一个"RX"。现给定起始字符串start和结束字符串end,请编写代码,当且仅当存在一系列移动操作使得start可以转换成end时, 返回True

示例 :

输入: start = "RXXLRXRXL", end = "XRLXXRRLX"
输出: True
解释:
我们可以通过以下几步将start转换成end:
RXXLRXRXL ->
XRXLRXRXL ->
XRLXRXRXL ->
XRLXXRRXL ->
XRLXXRRLX

注意:

  1. 1 <= len(start) = len(end) <= 10000
  2. startend中的字符串仅限于'L', 'R''X'

这个问题的描述有一定误导性,问题中所指的移动操作真的是只限定于"LX" to "XL",而不能是"XL" to "LX"。

接下来分析问题,剔除两条字符串中的所有"X",会发现若两条字符串符合条件,经剔除"X"后所得的两条字符串是完全相同的。

如例中:start = "RLRRL", end = "RLRRL"。

再根据"L"只能后移"R"只能前移的特性,可得知"L"移动后在字符串中序号大于等于移动前,"R"则相反。

代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class No_777 {

    public static boolean canTransform(String start, String end) {
		
    	char[] s = start.toCharArray();
    	char[] e = end.toCharArray();
    	List<Integer> sInt = new ArrayList<Integer>();
    	List<Integer> eInt = new ArrayList<Integer>();
    	List<Character> sList = new ArrayList<Character>();
    	List<Character> eList = new ArrayList<Character>();
    	
    	//剔除两条字符串中"X"
    	for(int i=0; i<s.length; i++){    		
    		if(s[i] != 'X'){
    			sList.add(s[i]);
    			sInt.add(i);
    		}
    	}
    	for(int i=0; i<e.length; i++){    		
    		if(e[i] != 'X'){
    			eList.add(e[i]);
    			eInt.add(i);
    		}
    	}
    	
    	//若处理后字符串不相等直接返回false
    	if(!sList.equals(eList)){
    		return false;
    	}
    	
    	//检查每个字符始末位置是否符合规则
    	for(int i=0; i<sInt.size(); i++){
    		if(sList.get(i) == 'R'&&sInt.get(i) > eInt.get(i)){
    			return false;
    		}else if(sList.get(i) == 'L'&&sInt.get(i) < eInt.get(i)){
    			return false;
    		}
    	}
    	
    	return true;
        
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sca = new Scanner(System.in);
		String start = sca.nextLine();
		String end = sca.nextLine();
		
		System.out.println(canTransform(start, end));
	}

}

猜你喜欢

转载自blog.csdn.net/houfanjkl/article/details/81431721