题目描述:指定一个字符串,进行左旋k位操作。即字符串的前k位字符移到字符串的尾部,形成新的字符串。如把字符串abcdef左旋3位,得到defabc。要求对长度为n的字符串,时间复杂度为O(n)。
笨方法:开辟一个大小为n的内存空间,将前k个字符拷到最后k个位置上,然后将原先的n-k个字符拷到前面的n-k个位置上。这种方法最直接,时间复杂度为O(n),空间复杂度也为O(n)。java实现代码如下。
public class ZuoXuan{
public static void main(String[] args){
String s="abcdef";
String l=leftRoate(s,3);
System.out.println(l);
}
public static String leftRoate(String str, int n){
String str1=str.substring(0,n);
String str2=str.substring(n);
return str2+str1;
}
}
比较好的解决办法是三次反转法,先反转前k个字符,然后反转后面的n-k个字符,然后反转整个字符串。如abcdef左旋3位,第一步反转前3个字符,变成cbadef,第二部反转后3个字符,变成cbafed,然后反转整个字符串变成defabc。这个算法的时间复杂度为O(n),空间复杂度为O(1)。java实现代码如下。
public class ZuoXuan{
public static void main(String[] args){
String s="abcdefg";
String l=leftRoate(s,3);
System.out.println(l);
}
public static String leftRoate(String str, int n){
if(str==null||str.length()==0){
return str;
}
if(n<=0||n>str.length()){
return str;
}
int begin=0;
int end=str.length()-1;
char []c=str.toCharArray();
reverseString(c,begin,n-1);
reverseString(c,n,end);
reverseString(c,begin,end);
return new String(c);
}
public static String reverseString(char[] c, int begin, int end){
if(begin>=end){
return null;
}
for(int i=begin,j=end;i<j;i++,j--){
char temp=c[i];
c[i]=c[j];
c[j]=temp;
}
return new String(c);
}
}