You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:01:33