左旋转字符串

61 阅读1分钟

58 左旋转字符串

解法一:

申请额外空间

class Solution {
    public String reverseLeftWords(String s, int n) {
        //申请额外空间
        StringBuilder sb = new StringBuilder();
        //添加n索引之后字符串
        for(int i = n; i < s.length(); i++) {
            sb.append(s.charAt(i));
        }

        //添加n索引之前字符串
        for(int i = 0; i < n; i++) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }
}

解法二:

不能申请额外空间,只能在本串上操作

①反转区间为前n的子串

②反转区间为n到末尾的子串

③反转整个字符串

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder sb = new StringBuilder(s);
        //反转区间为前n的子串
        reverseString(sb, 0, n-1);
        //反转区间为n到末尾的子串
        reverseString(sb, n, sb.length()-1);
        //反转整个字符串
        reverseString(sb, 0, sb.length()-1);
        return sb.toString();
    }

    //反转字符串
    private void reverseString(StringBuilder s1, int start, int end) {
        while(start < end) {
            char c = s1.charAt(start);
            s1.setCharAt(start, s1.charAt(end));
            s1.setCharAt(end, c);
            start++;
            end--;
        }
    }
}