package cn.fansunion.leecode.string; /** * 旋转字符串 给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。 * * s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 * * 例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。 * * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * * @author wen.lei@brgroup.com * * 2022-2-16 */ public class RotateString { // 输入: s = "abcde", goal = "cdeab" // 输出: true public boolean rotateString(String s, String goal) { final int length = s.length(); for ( int index = 0 ; index < length; index++) { if (s.equals(goal)) { return true ; } else { s = rotateStr(s); } } return false ; } // 比较清晰的代码 public boolean rotateString2(String s, String goal) { if (s.equals(goal)) { return true ; } final int length = s.length(); for ( int index = 0 ; index < length; index++) { s = rotateStr(s); if (s.equals(goal)) { return true ; } } return false ; } private String rotateStr(String s) { StringBuilder sb = new StringBuilder(); sb.append(s.subSequence( 1 , s.length())); sb.append(s.charAt( 0 )); return sb.toString(); } // 第1次,错误的代码 public boolean rotateStringError(String s, String goal) { final int length = s.length(); // 本来想优化一次,用“length - 1”,结果边界值情况,单元测试,没测到,尴尬了 // 为什么呢?index=0遍历,是原地比较,没有rotate for ( int index = 0 ; index < length - 1 ; index++) { if (s.equals(goal)) { return true ; } else { s = rotateStr(s); } } return false ; } //官方,创新解法 //在写代码的过程中,更加侧重“按照题目的功能和流程”来实现,这种“投机取巧”的解法,一般不会特别去想 //"蛇咬住自己的尾巴”,头脑中可能有1/10000的瞬间,考虑过类似思路,没细想,习惯标准解法了 public boolean rotateString5(String A, String B) { return A.length() == B.length() && (A + A).contains(B); } } |