题目描述
实现代码
/**
* 判断是否可以进行变换
* @param start 开始字符串
* @param target 目标字符串
* @return 可以进行变换返回true,否则返回false
*/
public boolean canChange(String start, String target) {
// 去除下划线后比较两个字符串是否相等
if (!start.replaceAll("_", "").equals(target.replaceAll("_", "")))
return false;
// 遍历两个字符串并进行比较
for (int i = 0, j = 0; i < start.length(); i++) {
//start字符遍历到第一个非 _ 的字符 然后再去while遍历target的第一个非 _ 的字符,此时索引j
//这里可能有点懵,但是好理解,这跟两个循环分别判定没区别,只是这样写代码更加简洁
if (start.charAt(i) == '_'){
continue;
}
// 跳过目标字符串中的下划线
while (target.charAt(j) == '_'){
j++;
}
//取到两个字符串分别第一个非 _ 的字符的索引后
// 比较字符'L'的位置是否满足条件==》如果i!=j,且(字符i为L,且此时i《j)返回false 应该i>=j才true
// if (i != j && (start.charAt(i) == 'L') == (i < j)){
// return false;
// }
//提问:问什么判断完一次就可以++j了?不用管其他条件了吗?
/*
* i=j 不用判断对应的字符相等吗? 不用,因为第一个条件就判断了,证明此时的两个字符中对应的字母顺序都是一样的
* 此时只有i!=j 在判断start.charAt(i) == 'R'不管吗? =》不管,此时=L和i<j分别为条件1,2
* 条件1不变+》条件2变 则true j++ 所以不管
* 条件1变 条件2不变, 此时i为R,且i<j 为true 不管 这里也逻辑等价上面那个。
* 条件1变 条件2也变 此时i为R 且i>=R 也要返回false? 不管,因为逻辑等价,这个点仔细想想
* */
//保证好看懂可以写以下
if (i != j) {
if (start.charAt(i) == 'L' && i < j) {
return false;
}
if (start.charAt(i) == 'R' && i > j) {
return false;
}
}
++j;
}
// 可以进行变换
return true;
}
参考:
放球问题 质因数分解【力扣周赛 301】LeetCode_哔哩哔哩_bilibili
难点:
1.
去除下划线后比较两个字符串是否相等,不相等返回false,因为根据题意我们可以知道字符移动不能交换L R的位置,只能交换 _ 的位置,所以在去除下划线后如果字符不相等,即fasle
2.
每次遍历每个字符的第一个不为_的字符,
* 如果当前字符为 L 且 i<j,由于 L 由于无法向右移动,返回 false; * 如果当前字符为 R 且 i>j,由于 R 由于无法向左移动,返回 false。
另外本题用了一个逻辑等价的思想简化了代码,具体看注释:
//取到两个字符串分别第一个非 _ 的字符的索引后 // 比较字符'L'的位置是否满足条件==》如果i!=j,且(字符i为L,且此时i《j)返回false 应该i>=j才true // if (i != j && (start.charAt(i) == 'L') == (i < j)){ // return false; // } //提问:问什么判断完一次就可以++j了?不用管其他条件了吗? /* * i=j 不用判断对应的字符相等吗? 不用,因为第一个条件就判断了,证明此时的两个字符中对应的字母顺序都是一样的 * 此时只有i!=j 在判断start.charAt(i) == 'R'不管吗? =》不管,此时=L和i<j分别为条件1,2 * 条件1不变+》条件2变 则true j++ 所以不管 * 条件1变 条件2不变, 此时i为R,且i<j 为true 不管 这里也逻辑等价上面那个。 * 条件1变 条件2也变 此时i为R 且i>=R 也要返回false? 不管,因为逻辑等价,这个点仔细想想 * */ //保证好看懂可以写以下 if (i != j) { if (start.charAt(i) == 'L' && i < j) { return false; } if (start.charAt(i) == 'R' && i > j) { return false; } }
这里可以多借鉴一下思想,以后有用处