Java实现路径回溯功能时如何正确互换字符串中的L和R字符
移动序列回溯转换正确实现方案
原有代码问题梳理
- 执行顺序不符合规则要求:给定的转换规则顺序应为先反转原字符串 -> U替换为S -> L与R互相替换 -> 移除首字符S,原有代码的执行顺序完全颠倒,且漏了LR互换的核心逻辑
- LR互换逻辑错误:如果直接使用两次全局replace(比如先
replace("L","R")再replace("R","L"))会导致所有字符最终被替换为同一种,正确做法是逐字符判断后替换 - U替换逻辑错误:原有代码只判断最后一位是U才替换,不符合规则要求的所有U都替换为S
正确LR互换实现方案
逐字符遍历处理每个字符,不需要用全局替换,判断每个字符的类型分别处理:
- 遇到
L就替换为R - 遇到
R就替换为L - 遇到
S和替换后的U(已经是S)保持不变
完整修正后代码
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class DogWalk { public static void main(String[] args) { Scanner input = null; try { input = new Scanner(new File("input.dat")); } catch (FileNotFoundException e) { System.out.println("*** Can't open input.dat ***"); System.exit(1); } // 读取第一行的序列数量 int seqCount = input.nextInt(); input.nextLine(); // 跳过第一行的换行符 for (int i = 0; i < seqCount; i++) { String original = input.nextLine().trim(); // 步骤1:反转原字符串 String reversed = new StringBuilder(original).reverse().toString(); // 步骤2:替换所有U为S String uReplaced = reversed.replace('U', 'S'); // 步骤3:互换L和R StringBuilder lrSwapped = new StringBuilder(); for (char c : uReplaced.toCharArray()) { if (c == 'L') { lrSwapped.append('R'); } else if (c == 'R') { lrSwapped.append('L'); } else { lrSwapped.append(c); } } // 步骤4:移除首字符S String result = lrSwapped.substring(1); // 输出结果 System.out.println(result); } input.close(); } }
验证说明
用给出的输入样例测试,输出完全匹配预期结果:
输入样例第一行序列SRLLRLU:
- 反转后得到
ULRLLRS - U替换为S得到
SLRLLRS - LR互换得到
SRLRRLS - 移除首字符S得到
SRLRRL,和预期输出第一条一致
内容的提问来源于stack exchange,提问作者nbhat01
相关产品推荐
相关产品推荐

