思路一:左移字符挨个拼接,将源字符串截断 再相加
public class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||str.length()==0)
return str;
StringBuffer strs = new StringBuffer();
for(int i=0;i<n;i++)
{
strs.append(str.charAt(i));
}
String s = new String(strs);
return str.substring(n)+s;
}
}
时间O(N) 空间O(N)
思路二:队列
import java.util.*;
public class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||str.length()==0)
return str;
Queue<Character> queue = new LinkedList();
for(int i=n;i<str.length();i++)
{
queue.add(str.charAt(i));
}
for(int i=0;i<n;i++)
{
queue.add(str.charAt(i));
}
StringBuffer strs=new StringBuffer();
while(!queue.isEmpty())
{
strs.append(queue.poll());
}
return new String(strs);
}
}
时间O(N),空间O(N);感觉比思路一复杂度还高点
思路三:部分反转+整体反转
这种方法如果是C++来做,那么时间为O(N),空间O(1)。因为C++中字符串就是字符数组。可以原地反转
public class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||str.length()==0)
return str;
char chs[]=str.toCharArray();
int j=n-1;
for(int i=0;i<n/2;i++)
{
char temp=chs[i];
chs[i]=chs[j];
chs[j]=temp;
j--;
}
System.out.println(chs);
j=str.length()-1;
//***这个后半部分的反转注意下,范围!!!(n+str.length())/2
for(int i=n;i<(n+str.length())/2;i++)
{
char temp=chs[i];
chs[i]=chs[j];
chs[j]=temp;
j--;
}
System.out.println(chs);
j=str.length()-1;
for(int i=0;i<str.length()/2;i++)
{
char temp=chs[i];
chs[i]=chs[j];
chs[j]=temp;
j--;
}
return new String(chs);
}
}
时间空间都是O(N)