LeetCode 186 - Reverse Words in a String II

931 ワード

Reverse Words in a Stringと似ていますが、ここではin-place、つまり余分な空間を開く必要はありません.
[解析]この問題はLeetCodeで先頭と末尾にスペースがなく、単語の間にスペースが1つしかないと仮定します.しかし、これらの仮定を必要としなくてもいいです.コードが複雑になるということです.考え方は2つのステップで、最初のステップは文字列全体を反転することです.次に、最初から徐々にスキャンして、単語に遭遇したたびに反転します.
[注意点]1)Javaであれば、Stringはimmutableだと面接官に指摘すべきなので、char arrayでやる必要があります.2)follow-up問題:k-step reverse.すなわち,第2部で反転する場合,k個の単語を1つの長い単語と見なして反転する.
public void reverseWords(char[] s) {
    reverse(s, 0, s.length);
    for (int i=0, j=0; j<=s.length; j++) {
        if (j==s.length || s[j]==' ') {
            reverse(s, i, j);
            i =  j + 1;
        }
    }
}

private void reverse(char [] s, int begin, int end) {
    for (int i=0; i<(end-begin)/2; i++) {
        char temp = s[begin+i];
        s[begin+i] = s[end-i-1];
        s[end-i-1] = temp;
    }
}