1. 左旋转字符串
对于一个给定的字符序列 S,把其循环左移 N 位后的序列输出。例如字符序列 S=”abcdef”,输出循环左移3位后的结果,即“defabc”
2. 解法
-
字符串 S 为
abcdef
,n=3,设X=abc
,Y=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--; } }
-
使用队列作为辅助结构,利用队列先进先出的特性完成字符串左移。对于字符串
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(); }