一、题目描述
原文链接:剑指 Offer 58 - II. 左旋转字符串
具体描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
示例 2:
限制:
1 <= k < s.length <= 10000
二、思路分析
第一种解法:利用字符串截取函数来解决,先截取0到k - 1,在截取k到末尾,然后拼接返回!但是这样做的话,直接把这道题混成了水题!
第二种解法:反转字符串大法,之前颠倒字符串中的单词先进行全局反转,然后在进行局部反转,最终得到了答案,这次换一个思路(当然按照刚刚的方式是可以的!),可以先进行局部反转,然后在进行全局反转!先把0到k-1和k到字符串末尾反转,最后反转整个字符串,诶答案就出来了~
三、AC代码
使用函数:
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder result = new StringBuilder();
result.append(s.substring(n, s.length()));
result.append(s.substring(0, n));
return result.toString();
}
}
双指针反转:
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder(s);
reverseString(sb, 0, n - 1);
reverseString(sb, n, s.length() - 1);
reverseString(sb, 0, s.length() - 1);
return sb.toString();
}
public void reverseString(StringBuilder sb, int start , int end){
while (start < end){
char tmp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, tmp);
start++;end--;
}
}
}
四、总结
- 局部反转在全局反转!
- 全局反转在局部反转!