zoukankan      html  css  js  c++  java
  • 443. String Compression

    package LeetCode_443
    
    /**
     * 443. String Compression
     * https://leetcode.com/problems/string-compression/
     * Given an array of characters chars, compress it using the following algorithm:
    Begin with an empty string s. For each group of consecutive repeating characters in chars:
    If the group's length is 1, append the character to s.
    Otherwise, append the character followed by the group's length.
    The compressed string s should not be returned separately, but instead be stored in the input character array chars.
    Note that group lengths that are 10 or longer will be split into multiple characters in chars.
    After you are done modifying the input array, return the new length of the array.
    
    Follow up:
    Could you solve it using only O(1) extra space?
    
    Example 1:
    Input: chars = ["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: The groups are "aa", "bb", and "ccc". This compresses to "a2b2c3".
    
    Example 2:
    Input: chars = ["a"]
    Output: Return 1, and the first character of the input array should be: ["a"]
    Explanation: The only group is "a", which remains uncompressed since it's a single character.
    
    Example 3:
    Input: chars = ["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: The groups are "a" and "bbbbbbbbbbbb". This compresses to "ab12".
    
    Constraints:
    1. 1 <= chars.length <= 2000
    2. chars[i] is a lower-case English letter, upper-case English letter, digit, or symbol.
     * */
    class Solution {
        /*
        * solution: scan array to counting number of char, Time:O(n), Space:O(1)
        * */
        fun compress(chars: CharArray): Int {
            var count = 1
            var index = 0
            val n = chars.size
            var i = 0
            while (i < n) {
                //check if current char equals next one,if yes, increasing i and count
                while (i < n - 1 && chars[i] == chars[i + 1]) {
                    count++
                    i++
                }
                if (count == 1) {
                    //count==1, just replace char
                    chars[index++] = chars[i]
                } else {
                    //count>1, replace char and count
                    chars[index++] = chars[i]
                    //handle the number
                    val countStr = count.toString()
                    for (k in countStr.indices) {
                        chars[index++] = countStr[k]
                    }
                }
                i++
                //reset count
                count = 1
            }
            return index
        }
    }
  • 相关阅读:
    赫夫曼树JAVA实现及分析
    JAVA多线程之wait/notify
    JAVA多线程之volatile 与 synchronized 的比较
    JAVA多线程之线程间的通信方式
    并查集与贪心算法的应用之求解无向图的最小生成树
    Android自定义图形,图形的拼接、叠加、相容
    CSDN问答频道“华章杯”7月排行榜活动开始,丰厚奖品等你拿
    修改MyEclipse内存-------OutOfMemoryError错误
    MySQL中MySQL X.X Command Line Client一闪而过的问题
    C++组合问题
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14279239.html
Copyright © 2011-2022 走看看