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