如何实现字符串旋转判断函数?解决代码边缘case处理难题
解决字符串旋转判断的问题
嘿,我来帮你搞定这个字符串旋转判断的问题!其实判断一个字符串是不是另一个的旋转版本,有个经典又高效的思路,而且能很好地处理边缘情况,咱们一步步来聊。
核心思路
如果字符串 s2 是 s1 的旋转版本,那把 s1 和自己拼接起来得到的新字符串(比如 s1+s1),一定会包含 s2 作为子串。举个例子:waterbottle 拼接后是 waterbottlewaterbottle,你会发现 lewaterbott、bottlewater 这些旋转后的字符串都能在里面找到。不过要注意,必须先确保两个字符串长度相等,不然直接就可以排除了。
要重点处理的边缘情况
- 如果两个字符串长度不一样,直接返回
false(长度不同不可能是旋转关系) - 两个都是空字符串:返回
true - 其中一个是空,另一个非空:返回
false - 两个字符串完全相同:这其实也是旋转的一种(旋转0次),应该返回
true
完整代码实现
function checkRotationStrings(s1, s2) { // 先处理长度不等的情况 if (s1.length !== s2.length) { return false; } // 处理空字符串的特殊情况 if (s1 === '' && s2 === '') { return true; } // 核心判断:s2是否是s1+s1的子串 return (s1 + s1).includes(s2); }
验证你的测试用例
咱们来跑一下你给的测试:
checkRotationStrings('waterbottle', 'lewaterbott')→true(符合预期)checkRotationStrings('waterbottle', 'bottlewater')→true(符合预期)checkRotationStrings('waterbottle', 'erbottlewat')→true(符合预期)checkRotationStrings('waterbottle', 'lewaterbottx')→false(符合预期)
额外说明
这个方法的时间复杂度主要取决于字符串匹配的效率,JavaScript里的includes底层实现是高效的,所以整体复杂度是O(n)(n是字符串长度),比暴力枚举所有旋转情况要高效得多。如果之前的代码没处理好边缘情况,比如没判断长度或者空字符串,用这个版本应该就能解决啦!
内容的提问来源于stack exchange,提问作者user7496931
相关产品推荐
相关产品推荐

