• 【leetcode】Reorganize String


    题目如下:

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to each other are not the same.
    If possible, output any possible result.  If not possible, return the empty string.
    
    Example 1:
    Input: S = "aab"
    Output: "aba"
    Example 2:
    
    Input: S = "aaab"
    Output: ""
    
    Note: S will consist of lowercase letters and have length in range [1, 500].

    解题思路:刚看到这个题目,我觉得有点无从下手。但是仔细考虑之后,我觉得这个题目满足一个经典的算法场景——把一个数组分成两个子数组,使得两个子数组和最接近。例如,输入的字符串S="aabc",可以被实例化成字段d = {a:2,b:1,c:1},那么三个字符出现的次数就构成了[2,1,1],把数组分成和最接近的两个子数组[2]和[1,1]。最后是生成输出的字符串,只要在两个数组中依次各取一个字符拼接即可。注意:如何两个子数组和差值大于2的话,那么是不可能组成题目要求的字符串的。

    代码如下:

    //动态规划思想分割子数组
    var diff = function(map){
        var len = map.length
        var sum = 0
        for(var i =0;i<len;i++){
            sum += map[i].v
        }
        var dp = []
        for(var i =0;i<=len;i++){
            var list = []
            for(var j = 0;j <= sum/2;j ++){
                list.push(0)
            }
            dp.push(list)
        }
        for(var i =1;i<=len;i++) {
            for(var j = 1;j <= sum/2;j ++) {
                if(j>=map[i-1].v){
                    dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-map[i-1].v]+map[i-1].v);
                }
                else {
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        //子数组和的差值大于等于2,直接返回空
        if (sum - 2*dp[len][parseInt(sum / 2)] >=2){
            return ""
        }
        var t = parseInt(sum/2)
        var s1 = ""
        var s2 = ""
        //确定每个子数组的分配的元素
        for(var i=len;i>0;i--){
            if(dp[i][t] > dp[i-1][t]){ // 找到第一个接近 sum/2 的,然后与 它上面的比较,如果大于,则代表当前 i 被选中
                t -= map[i-1].v;
                var tmp = map[i-1].v
                while (tmp-- > 0){
                    s1 += map[i-1].k
                }
            }
            else{
                var tmp = map[i-1].v
                while (tmp-- > 0){
                    s2 += map[i-1].k
                }
            }
        }
        //生成返回值,依次从每个子数组中取一个元素,注意和较大的子数组排在前面
        var s = ""
        for(var i = 0;i<Math.min(s1.length,s2.length);i++){
            if(s1.length > s2.length){
                s += s1[i]
                s += s2[i]
            }
            else{
                s += s2[i]
                s += s1[i]
            }
    
        }
        if(s1.length != s2.length){
            s += (s1.length > s2.length ? s1[s1.length-1] : s2[s2.length-1])
        }
        return s
    }
    
    var reorganizeString = function(S) {
        var dic = new Array(26)
        for(var i=0;i<S.length;i++){
            var a = S[i].charCodeAt() - 'a'.charCodeAt()
            if(dic[a] == undefined){
                dic[a] = 1
            }
            else{
                dic[a] ++
            }
        }
        var d2 = []
        for(var i=0;i<dic.length;i++){
            if (dic[i] == undefined){
                continue
            }
            var ascii = String.fromCharCode(i + 'a'.charCodeAt())
            d2.push({'k':ascii,'v':dic[i]})
        }
    
        d2.sort(function(a,b){
            return b.v - a.v
        })
        return diff(d2)
    
    
    };
  • 相关阅读:
    (二)unittest之跳过测试和预期失败的用例
    (一)基本使用
    python从入门到入魔
    (十)中断测试
    (九)进程测试
    (八)安装、卸载与升级更新测试
    (七)功能测试
    (六)内存分析,待补充
    (五)跑Monkey过程中出现的ANR问题分析
    (四)一种精准monkey测试的方法
  • 原文地址:https://www.cnblogs.com/seyjs/p/8343574.html
Copyright © 2020-2023  润新知