算法-左旋转字符串

1. 左旋转字符串

对于一个给定的字符序列 S,把其循环左移 N 位后的序列输出。例如字符序列 S=”abcdef”,输出循环左移3位后的结果,即“defabc”

2. 解法

  1. 字符串 S 为abcdef,n=3,设X=abcY=def,原字符串可以表示成XY。此时用 T表示翻转, X 的翻转为XT,即XT=cba,同理YT=fed,那么YX=(XTYT)T,三次翻转后可得结果

    public String leftRotateString(String str, int n) {
        if (null == str || str.length() == 0 || n == 0 || str.length() < n) {
             return str;
         }
         char[] chars = str.toCharArray();
         reverse(chars, 0, n - 1);
         reverse(chars, n, chars.length - 1);
         reverse(chars, 0, chars.length - 1);
         return new String(chars);
     }
    
     public void reverse(char[] chars, int start, int end) {
         while (start < end) {
             char temp = chars[start];
             chars[start] = chars[end];
             chars[end] = temp;
             start++;
             end--;
         }
     }
    
  2. 使用队列作为辅助结构,利用队列先进先出的特性完成字符串左移。对于字符串abcdef,n=3,则队列从左到右变化如下:
    fedcba-> cbafed-> defabc

    public String leftRotateString(String str, int n) {
         if (null == str || str.length() == 0 || n == 0 || str.length() < n) {
             return str;
         }
         Queue q = new ArrayBlockingQueue(str.length());
         char[] a = str.toCharArray();
         int len = a.length;
         for (int i = 0; i < len; i++) {
             q.add(a[i]); // 1. fedcba
         }
    
         for (int j = 0; j < n; j++) {
             q.add(q.poll()); // 2. cbafed
         }
         StringBuilder sb = new StringBuilder();
         for (int k = 0; k < len; k++) {
             sb.append((char) q.poll()); // 3. defabc
         }
         return sb.toString();
     }
    

你可能感兴趣的:(算法,字符串)