LeetCode 443. String Compression

原题链接在这里:https://leetcode.com/problems/string-compression/

题目:

Given an array of characters, compress it in-place.

The length after compression must always be smaller than or equal to the original array.

Every element of the array should be a character (not int) of length 1.

After you are done modifying the input array in-place, return the new length of the array.

Follow up:
Could you solve it using only O(1) extra space?

Example 1:

Input:
["a","a","b","b","c","c","c"]

Output:
Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"]

Explanation:
"aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".

Example 2:

Input:
["a"]

Output:
Return 1, and the first 1 characters of the input array should be: ["a"]

Explanation:
Nothing is replaced.

Example 3:

Input:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]

Output:
Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"].

Explanation:
Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12".
Notice each digit has it's own entry in the array.

题解:

Accumlate the count of repeating chars, if count > 1, append to the char.

To use constant space, first assign the count from the end by count % 10. Then reverse this part.

Time Complexity: O(chars.length). Space: O(1).

AC Java:

 1 class Solution {
 2     public int compress(char[] chars) {
 3         if(chars == null || chars.length == 0){
 4             return 0;
 5         }
 6         
 7         int n = chars.length;
 8         int i = 0;
 9         int count = 0;
10         int pos = 0;
11         while(i < n){
12             char cur = chars[i];
13             while(i < n && chars[i] == cur){
14                 i++;
15                 count++;
16             }
17             
18             chars[pos++] = cur;
19             if(count > 1){
20                 int start = pos;
21                 while(count != 0){
22                     chars[pos++] = (char)(count % 10 + '0');
23                     count /= 10;
24                 }
25                 
26                 reverse(chars, start, pos - 1);
27             }
28             
29             count = 0;
30         }
31         
32         return pos;
33     }
34     
35     private void reverse(char[] chars, int i, int j){
36         while(i < j){
37             swap(chars, i++, j--);
38         }
39     }
40     
41     private void swap(char[] chars, int i, int j){
42         char temp = chars[i];
43         chars[i] = chars[j];
44         chars[j] = temp;
45     }
46 }

类似Encode and Decode StringsCount and SayDesign Compressed String Iterator.

posted @ 2018-01-05 10:39  Dylan_Java_NYC  阅读(471)  评论(0编辑  收藏  举报