Java中StringBuilder轮转后与String比较异常:字符串轮转判断错误
字符串轮转匹配问题排查
问题背景
给定两个字符串s和goal,当且仅当s经过若干次轮转后可以变为goal时,返回true。s的一次轮转操作是将其最左侧的字符移动到最右侧。例如,若s = "abcde",一次轮转后变为"bcdea"。
示例:
- 输入:
s = "abcde",goal = "cdeab",输出:true - 输入:
s = "abcde",goal = "abced",输出:false
我的代码
public static void main(String[] args) { System.out.println(rotateString("abcd","cdab")); } public static boolean rotateString(String s, String goal) { Boolean flag = false; StringBuilder builder = new StringBuilder(s); for (int i=0;i<=s.length()-1;i++){ if (builder.toString() == goal) { flag= true; break; } char temp = builder.charAt(builder.length()-1); for (int j=s.length()-1;j>=0;j--){ if (j==0) continue; builder.setCharAt(j, builder.charAt(j-1)); } builder.setCharAt(0,temp); } return flag; }
遇到的问题
运行代码后flag始终为false,但调试时明明看到builder.toString()和goal的内容完全相同,期望flag能变成true,找不到问题原因。
问题原因与修复
问题出在字符串比较的方式上:Java中==比较的是字符串对象的内存引用,而不是内容是否相等。哪怕两个字符串内容完全一样,只要是不同的对象,==就会返回false。
把判断条件里的==改成equals()方法即可,因为equals()才是用来比较字符串内容的:
if (builder.toString().equals(goal)) { flag = true; break; }
另外补充一点:你当前的轮转逻辑是把字符串最后一个字符移到最前面,和题目定义的“把最左侧字符移到最右侧”是反向操作,但因为循环了s.length()次,其实也能覆盖所有可能的轮转情况,所以只要修复比较逻辑就能得到正确结果。如果想贴合题目定义的轮转方式,可以简化轮转代码:
// 替换原轮转逻辑 char firstChar = builder.charAt(0); builder.deleteCharAt(0); builder.append(firstChar);
这样代码会更简洁高效。
内容的提问来源于stack exchange,提问作者Aditya Simant
相关产品推荐
相关产品推荐

