首页 > 其他分享 >LeetCode -- 767. 重构字符串

LeetCode -- 767. 重构字符串

时间:2023-07-03 09:00:10浏览次数:36  
标签:cnt idx -- res ++ 767 mx int LeetCode

 

设字符串s长度为len

s可以重构为相邻字符串不同时 有字符串中出现次数最多的字符 < (len + 1) >> 1

当满足上述条件时候,我们就能对其进行重构

重构法:先放置偶数位置,再放置奇数位置

c ++ 
class Solution {
public:
    string reorganizeString(string s) {
        vector<int> cnt(26, 0);
        int n = s.size();
        for(int i = 0; i < n; i ++ ) {
            cnt[s[i] - 'a'] ++ ;
        }

        int mx = 0, alp = 0, lim = (n + 1) >> 1;
        for(int i = 0; i < 26; i ++ ) {
            if(cnt[i] > mx) {
                mx = cnt[i];
                alp = i;
            }
        }

        if(mx > lim) return "";

        string res(n, ' ');
        int idx = 0;
        while(cnt[alp] -- > 0) {
            res[idx] = 'a' + alp;
            idx += 2;
        }

        for(int i = 0; i < 26; i ++ ) {
            while(cnt[i] -- > 0) {
                if(idx >= n) {
                    idx = 1;
                }
                res[idx] = 'a' + i;
                idx += 2;
            }
        }

        return res;
    }
};

 

解法二:利用桶(分组分类)思想

思路 1. 将相同的字符放入不同的桶中以保证其彼此不会相邻,因此桶的数目应等于字符串中最多的元素的数目; 2. 按贪心策略,优先填充数目最多的元素,对于每一种元素,循环在不同桶中进行填充,由于桶的个数等于字符串中最多的元素的数目,因此每个桶中不会出现相同的元素,填充完毕后将桶依次相连即为答案; 3. 若填充完毕后长度为1的桶(只可能出现在最后的位置)的数目多于1,将桶依次相连会使得这些长度为1的桶中的相同元素相邻,说明不存在相应的排列,返回""(这一情况即官解中说明的如果存在一个字母的出现次数大于(n+1)/2,其中n为字符串长度,则无法重新排布字母使得相邻的字母都不相同)。

c ++ 
class Solution {
public:
    string reorganizeString(string s) {
        vector<int> cnt(26);
        int n = s.size();
        for(int i = 0; i < n; i ++ ) {
            cnt[s[i] - 'a'] ++ ;
        }

        int mx = -1, pos = -1, lim = n + 1 >> 1;
        for(int i = 0; i < cnt.size(); i ++ ) {
            if(cnt[i] > mx) {
                mx = cnt[i];
                pos = i;
            }
        }
        if(mx > lim) return "";
        //初始化桶,将最多的元素放进去
        vector<string> buf(mx);
        for(int i = 0; i < cnt[pos]; i ++ ) {
            buf[i] += 'a' + pos;
        }
        cnt[pos] = 0;

        int idx = 0;
        for(int i = 0; i < 26; i ++ ) {
            for(int j = 0; j < cnt[i]; j ++ ) {
                buf[idx] += 'a' + i;
                idx = (idx + 1) % mx;
            }
        }

        string res;
        for(int i = 0; i < mx; i ++ ) {
            res += buf[i];
        }

        return res;
    }
};
python
class Solution:
    def reorganizeString(self, s: str) -> str:
        cnt, idx = Counter(s), 0
        bufnum = cnt.most_common(1)[0][1]
        if bufnum > (len(s) + 1) // 2:
            return ""
        buckets = [[] for _ in range(bufnum)]
        for c, num in cnt.most_common():
            for _ in range(num):
                buckets[idx].append(c)
                idx = (idx + 1) % bufnum
            
        return "".join(["".join(bucket) for bucket in buckets])

 

标签:cnt,idx,--,res,++,767,mx,int,LeetCode
From: https://www.cnblogs.com/zk6696/p/17521866.html

相关文章

  • 如何安装GIS4CAD插件?
        GIS4CAD插件是一款基于AutoCAD的功能套件,它提供了一系列GIS功能。通过该插件,您可以轻松地在AutoCAD中导入和导出SHP、MDB、Kml、Kmz、Gpx、GeoJson、EXCEL、TXT、CSV等多种格式的矢量文件,并支持SQLServer、MySQL、PostgreSQL等多种数据库的导入和导出。同时,GIS4CAD......
  • 7.2总结
    早上起的比较晚,就没有赶上吃早饭,自己吃的泡面,吃完泡面就玩了会游戏,玩了一会就狠狠的刷科一的题,刷了起码两个小时,真的麻了,中午做了个饭,天气是真的热啊,出一身的汗吃了个午饭就眯了一下小会儿,又看科一的题,看模拟题做的真难,跟本就就不能及格,下午就收拾收拾家里,就做的晚饭吃,吃完学习了......
  • BackUpLogView 系列 - 系统基础软件下载
    --------------------------------------------------------------------------------------------------------索引:1.   一步一步做好全院数据备份之一:系统基础软件下载2.    一步一步做好全院数据备份之一:生成日志数据库脚本(MSSqlServer)3.    一步一步做好......
  • Matlab-对wav音频文件AM调制及解调
    1.读取wav音乐文件%读取音频文件filename='jay.wav';[sound_data,fs]=audioread(filename);%9507502x244100sound_data_1=sound_data(:,1);sound_data_1=sound_data_1';%转置sound_data有两列,因为此音乐文件有两个通道,音频采样率为44100;这......
  • 交易
    期货海贼王一路加仓纯碱见路不走币圈股市阳光城......
  • 撩妹语录
    脱单师木木做我女朋友吗,对女朋友很好的那种我觉得聊天聊久了容易尬聊,然后不了了之我们可以见一见在白天的时候,然后人多的地方不会有危险我请你吃烤肉的那种人生三大错觉婚姻评价照片女生提出同居怎么回复......
  • 职场语录
    杰克入职奖金包......
  • OSPF_Type5_LSA_COST
    目录理论实验验证基础配置产生五类(默认开销type-2)修改(强制开销type-1)查看理论五类LSA默认有两种开销计算方法,(默认开销类型是tpye2)type1特点开销在OSPF域内不断增加type2默认开销类型是tpye2,默认就是这种的特点开销在OSPF域内会始终保持不变当我们引入路由时,默......
  • [FAQ] 对于 Puppeteer 和 Chromium 在 Linux 上的安装,需要安装哪些依赖库
     比如puppeteer/chrome/linux-114.0.5735.133/chrome-linux64/chrome到底要装哪些依赖。 一般根据报错提示,安装缺少的即可,以下是一般需要的:$sudoapt-getinstalllibatk1.0-0libatk-bridge2.0-0libcups2libxkbcommon0libxcomposite1libxdamage1libxfixes3libxr......
  • LCT
    动态树问题的引入静态树问题静态树问题的一般形式如下:给定一个树,点和边可能有权。要对这个树按时间顺序进行一些操作和询问。操作可以修改点和边的权值。询问可以对链和子树进行询问。通俗的讲,所有在整个过程中树的结构不变的树论问题就叫静态树问题。动态树问题动态树......