算法笔记_022:字符串的旋转(Java)
目录
1 问题描述
给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。例如,将字符串“abcdef”的前3个字符‘a’、‘b’和‘c’移到字符串的尾部,那么原字符串将变成“defabc”。请写一个函数实现此功能。
2 解决方案
2.1 蛮力移位
此方法将需要移动的字符一个一个地移到字符串的尾部,具体代码如下:
package com.liuzhen.string_1; public class StringRevolve { //方法1:蛮力移位 /* * 参数s:给定字符串 * 返回每次移动一位后的结果字符串 */ public String bruteOne(String s){ char[] A = s.toCharArray(); char temp = A[0]; for(int i = 1;i < A.length;i++) A[i-1] = A[i]; A[A.length-1] = temp; return String.valueOf(A); } /* * 参数s:给定字符串 * 参数m:字符串前面需要移动的字符个数 * 返回最终移动目标字符串 */ public String bruteRevolve(String s,int m){ for(int i = m;i > 0;i--){ bruteOne(s); System.out.println(bruteOne(s)); s = bruteOne(s); } return s; } public static void main(String[] args){ StringRevolve test = new StringRevolve(); String s = "abcdef"; String result = test.bruteRevolve(s,8); System.out.println("使用蛮力移位法得到结果:"+result); } }
运行结果如下:
bcdefa
cdefab
defabc
efabcd
使用蛮力移位法得到结果:efabcd
2.2 三步反转
此方法分3个步骤:
(1)将原字符串分为X和Y两部分,其中X为“abc”,Y为“def”;
(2)将X的所有字符反转,即相当于将“abc”变为“cba”;对Y也进行反转,由“def”变为“fed”;
(3)最后,将上述步骤得到的结果整体再进行反转,即将“cbafed”整体反转为“defabc”,这样就实现了字符串旋转。
具体代码如下:
package com.liuzhen.string_1; public class StringRevolve { //方法2:三步反转 /* * 参数A:字符串转化后的字符数组 * 参数start:开始进行反转的字符位置 * 参数end:进行字符反转的最后一个字符位置 */ public void revolveString(char[] A,int start,int end){ while(start < end){ char temp = A[start]; A[start++] = A[end]; A[end--] = temp; } } /* * 参数s:给定字符串 * 参数m:字符串前面需要移动的字符个数 */ public String getRevolveString(String s,int m){ char[] A = s.toCharArray(); int len = s.length(); //字符串的总长度 m = m % len; //如果移动位数大于字符串总长度,则其移动位数默认为m取余len revolveString(A,0,m-1); revolveString(A,m,len-1); revolveString(A,0,len-1); return String.valueOf(A); } public static void main(String[] args){ StringRevolve test = new StringRevolve(); String s = "abcdef"; String result1 = test.getRevolveString(s, 4); System.out.println("使用三步反转法得到结果:"+result1); } }
运行结果:
使用三步反转法得到结果:efabcd
每天一小步,成就一大步