在一个由 '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;
class Solution {
public 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=; i<s.length; i++){
if(s[i] != 'X'){
sList.add(s[i]);
sInt.add(i);
}
}
for(int i=; 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=; 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) {
Solution s = new Solution(); Scanner sca = new Scanner(System.in);
String start = sca.nextLine();
String end = sca.nextLine(); System.out.println(s.canTransform(start, end));
} }
 class Solution {
public:
bool canTransform(string start, string end) {
if(start.length() != end.length())//长度不同,就算剔掉X之后相同,也是错的
return false;
int i=,j=;
while(i<end.length() && j<end.length()){
while(start[i]=='X'){ //找到start串接下去的第一个非X字符
i++;
}
while(end[j]=='X'){ //找到end串接下去的第一个非X字符
j++;
}
//如果这俩个非X字符不同,则剔除掉X之后的串必然不同,所以是错的。
if(start[i] != end[j])
return false;
if(start[i] == 'L' && i<j)//同为L,但在start的位置先于其在end串的位置,也是错的,L不能后移
return false;
if(start[i] == 'R' && i>j)
return false;
i++;
j++;
}
return true;
}
};

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

  1. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  2. 《将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中》的解决办法

    我们在写代码时,稍不注意就收到VS那文不对题的错误提示. 最近在项目上碰到了“将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中”的这个错误提 ...

  3. python2.7字典转换成json时中文字符串变成unicode的问题:

    参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...

  4. Sqlserver DateTime转换成SMALLDATETIME时“产生一个超出范围的值”

    工作中遇到一个问题,A表中字段(DateTime1)的数据类型为DateTime,新建了一张表B的SMALLDATETIME1字段的数据来自A表的DateTime1 但在将A表字段DateTime1导 ...

  5. c# 科学计数法值转换成正常值,返回字符串

    /// <summary> /// 科学计数法值转换成正常值 /// </summary> /// <param name="value">&l ...

  6. 判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。

    方式1:借助栈 空间辅助度是O(N) 方式2: 借助栈 空间复杂度是 O(n/2).只存后半个链表 方式3: 反转后半个链表  最后再反转回来 package my_basic.class_3; im ...

  7. luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  8. js转换成字符串

    有两种方法: 1.对于boolean, number, string类型,可调用toString()方法 2.用String(var)方法 其中,第二种方法使用范围更广,可将没有toString()方 ...

  9. 第三十五篇 入门机器学习——Juptyer Notebook中的常用快捷键

        1.运行当前Cell:Ctrl + Enter   2.运行当前Cell并在其下方插入一个新的Cell:Alt + Enter   3.运行当前Cell并选中其下方的Cell:Shift + ...

随机推荐

  1. c#单元测试:使用Moq框架Mock对象

    在.net中有几种mock框架可供选择,比如NMock,PhinoMocks,FakeItEasy和Moq.尽管Moq相对较新,但是它非常易用.不需要像传统的Record/Replay.并且使用Moq ...

  2. ASP.NET Web API中通过URI显示实体中的部分字段

    有时候我们可能不想显示某个实体中的所有字段.比如客户端发出如下请求: locaohost:43321/api/groups/1/items?fields=idlocaohost:43321/api/g ...

  3. C#中流的读写器BinaryReader、BinaryWriter,StreamReader、StreamWriter详解【转】

    https://blog.csdn.net/ymnl_gsh/article/details/80723050 C#的FileStream类提供了最原始的字节级上的文件读写功能,但我们习惯于对字符串操 ...

  4. Android Gesture Detector

    Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等.这些Gesture会使用户体验大大提升.An ...

  5. PAM 認 證 模 組

    作者:陳柏菁 E-mail 作用:限制哪些用户或者组可以从哪里登陆,或者可以建立/etc/nologin立即阻止一般用户登陆,限制 user可以使用的资源.例如cpu,文件,登陆数量,某些服务的登陆时 ...

  6. 原创:vsphere概念深入系列一:关于vsphere虚拟交换机的端口的数量限制。

    总结出来的概念: vm上有多少个虚拟网卡就被分配了多少个vPort.vswitch缺省情况下有8个vmk端口(vport)保留给vmkernel使用.但是当vport不够的时候也可以被使用. 默认第一 ...

  7. redis 频率限制

    方式1: $redis = new Redis(); //以自然时间控制 一自然分钟内超过100次进行限制, 屏蔽多久的时间必须为计数key时间的倍数 $key = 'xxxx'.date('Y-m- ...

  8. 11G新特性 -- 分区表和增量统计信息

    对于分区表,优化器会在全局级别为整个表维护一份统计信息,也会在分区级别为分区表维护一份统计信息. 对于大多数分区,dml一般都是在最近的分区上执行.在11g中,数据库支持只对那些发生一定数据变化的分区 ...

  9. 12C -- ORA-01017

    本地使用使用sqlplus,尝试连接12.2数据库报错: 在另外一台服务器上,使用sqlplus连接该库,可以成功: 解决方案: 根据MOS文档id:207303.1看出,只有11.2.0.3之上的客 ...

  10. Android UI系列-----LinearLayout的综合使用

    这里将会对LinearLayout的布局方式进行一个综合的使用,通过一个例子来看看LinearLayout的嵌套布局方式,在这之前首先介绍三个属性: 1.①android:layout_weigth: ...