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

    在一个由 '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"则相反。

     1         import java.util.ArrayList;
     2 import java.util.HashMap;
     3 import java.util.List;
     4 import java.util.Map;
     5 import java.util.Scanner;
     6 class Solution {
     7     public boolean canTransform(String start, String end) {
     8         
     9 
    10          
    11         char[] s = start.toCharArray();
    12         char[] e = end.toCharArray();
    13         List<Integer> sInt = new ArrayList<Integer>();
    14         List<Integer> eInt = new ArrayList<Integer>();
    15         List<Character> sList = new ArrayList<Character>();
    16         List<Character> eList = new ArrayList<Character>();
    17         
    18         //剔除两条字符串中"X"
    19         for(int i=0; i<s.length; i++){            
    20             if(s[i] != 'X'){
    21                 sList.add(s[i]);
    22                 sInt.add(i);
    23             }
    24         }
    25         for(int i=0; i<e.length; i++){            
    26             if(e[i] != 'X'){
    27                 eList.add(e[i]);
    28                 eInt.add(i);
    29             }
    30         }
    31         
    32         //若处理后字符串不相等直接返回false
    33         if(!sList.equals(eList)){
    34             return false;
    35         }
    36         
    37         //检查每个字符始末位置是否符合规则
    38         for(int i=0; i<sInt.size(); i++){
    39             if(sList.get(i) == 'R'&&sInt.get(i) > eInt.get(i)){
    40                 return false;
    41             }else if(sList.get(i) == 'L'&&sInt.get(i) < eInt.get(i)){
    42                 return false;
    43             }
    44         }
    45         
    46         return true;
    47         
    48     }
    49     
    50     public static void main(String[] args) {
    51         Solution s = new Solution();
    52  
    53         Scanner sca = new Scanner(System.in);
    54         String start = sca.nextLine();
    55         String end = sca.nextLine();
    56         
    57         System.out.println(s.canTransform(start, end));
    58     }
    59  
    60 }
    61 
    62         
     1 class Solution {
     2 public:
     3     bool canTransform(string start, string end) {
     4         if(start.length() != end.length())//长度不同,就算剔掉X之后相同,也是错的
     5             return false;
     6         int i=0,j=0;
     7         while(i<end.length() && j<end.length()){
     8             while(start[i]=='X'){ //找到start串接下去的第一个非X字符
     9                 i++;
    10             }
    11             while(end[j]=='X'){ //找到end串接下去的第一个非X字符
    12                 j++;
    13             }
    14             //如果这俩个非X字符不同,则剔除掉X之后的串必然不同,所以是错的。
    15             if(start[i] != end[j])
    16                 return false;
    17             if(start[i] == 'L' && i<j)//同为L,但在start的位置先于其在end串的位置,也是错的,L不能后移
    18                 return false;
    19             if(start[i] == 'R' && i>j)
    20                 return false;
    21             i++;
    22             j++;
    23         }
    24         return true;
    25     }
    26 };
  • 相关阅读:
    linux内存管理之数据结构必备
    Script快速入门与查表
    Bash编程linux诸多熟记命令
    NandFlash/NorFlash源码模型和驱动编写方法
    linux内存管理之uboot第一步
    《Magus Night》
    《P2447 [SDOI2010]外星千足虫》
    DFS 树的理解
    《2021CCPC桂林》
    《GRAPH》
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/9870796.html
Copyright © 2011-2022 走看看