给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:

输入: S = "aab"
输出: "aba"
示例 2:

输入: S = "aaab"
输出: ""
注意:

S 只包含小写字母并且长度在[1, 500]区间内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorganize-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

对字符串进行统计每一个字符出现的次数。

第一部分:先判断能否重新排布,当一个字母出现的个数比字符串长度一半还要多时就无法重新排布;

第二部分:进行重新排列,最长为500个,其实就可以开辟一个数组(相当于挖好坑,等下把萝卜埋下去就可以了),把同一字符间隔排序就好了:

1、以字符出现的个数多少来决定先排布哪个字符,举个栗子:aaaiij,如果不先排a,先把i和j用了,iji,就还剩下两个a,就无法重新排布。

2、先排0、2、4、6、8...位置上的,当已经填满一半时就可以排1、3、5、7...

举个栗子:aaaabbbbcccc

先排第一趟0、2、4、6、8、10:a_a_a_a_b_b_

接下来从1、3、5、7、9:ababacacbcbc

就完成了字符串的重新排列。

class Solution {
public:
string reorganizeString(string S) {
int num[30],l,p1,p2,temp[505],k,flag;
string res="";
fill(num,num+30,0);
for (int i=0;i<S.length();i++){
num[S[i]-'a']++;//对每一个字符进行统计出现的个数
}
for (int i=0;i<26;i++){
if (num[i]>=(S.length()+1)/2+1){//当有字符出现次数大于一般就判定为无法重新排列
return "";
}
}
l=0;//代表已完成重新排列的字符个数
p1 = -1;//记录当前填入的字符(找到的出现的次数的字符)
k=0;//当前填入到临时数组的下标
flag=0;//用与代表还没开始第二趟
while(l<S.length()){
if (l>=((S.length()+1)/2)&&flag==0){//当已填完一般的字符时,开始第二趟
k=1;
flag=1;
}
if (p1==-1||num[p1]==0){//当前指向的字符已全部完成了重新排列,需要找寻下一个字符
for (int i=0;i<26;i++){
if (num[i]!=0){
p1=i;
break;
}
}
for (int i=0;i<26;i++){//找到出现次数最多的字符
if (num[i]>num[p1]){
p1 = i;
}
}
}
temp[k]=p1;//填入该字符到临时数组中去
k+=2;//间隔填入
l++;
num[p1]--;
}
for (int i=0;i<S.length();i++){//按数组的排列,重新获得字符串
res+=('a'+temp[i]);
}
return res;
}
};

LeetCode 767. 重构字符串的更多相关文章

  1. Java实现 LeetCode 767 重构字符串(ASCII的转换)

    767. 重构字符串 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行,输出任意可行的结果.若不可行,返回空字符串. 示例 1: 输入: S = "aab&qu ...

  2. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  3. C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  4. C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  5. LeetCode:反转字符串中的元音字母【345】

    LeetCode:反转字符串中的元音字母[345] 题目描述 编写一个函数,以字符串作为输入,反转该字符串中的元音字母. 示例 1: 输入: "hello" 输出: "h ...

  6. LeetCode初级算法--字符串01:反转字符串

    LeetCode初级算法--字符串01:反转字符串 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  7. 前端与算法 leetcode 344. 反转字符串

    目录 # 前端与算法 leetcode 344. 反转字符串 题目描述 概要 提示 解析 解法一:双指针 解法二:递归 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 lee ...

  8. LeetCode初级算法--字符串02:字符串中的第一个唯一字符

    LeetCode初级算法--字符串02:字符串中的第一个唯一字符 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog. ...

  9. leetcode python反转字符串中的单词

    # Leetcode 557 反转字符串中的单词III### 题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. **示例1:** 输入: "L ...

随机推荐

  1. Luogu P5307 [COCI2019] Mobitel

    题意 有一个 \(r\times c\) 的矩阵 \(a\),矩阵的每个位置都有一个正整数,求从左上角走到右下角并且满足路径上数字乘积之和大于 \(n\) 的方案数. \(\texttt{Data R ...

  2. while语句的一个使用技巧

    作用类似于可以输入一个不定量长度的数组,但是严格来说 不可能出现任意长度. 内存是有限的 超出一定长度后,不可能存的下,虽然这个值可能是超级大的,但总有限度. 这里我们利用while(cin>& ...

  3. NB-IOT关键技术分析

    NB-IOT(NarrowBand Internet of Things,窄带IoT)是一种基于蜂窝的窄带物联网技术,支持低功耗设备在广域网的蜂窝数据连接.NB-IOT在物联网应用广泛,许多领域都充分 ...

  4. 参悟python元类(又称metaclass)系列实战(一)

    写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...

  5. numpy数组

    一.数组创建 基础数组 1.array() array函数可以创建一维或多维数 一维数组 1.arange(起始值,终值,步长) 2.linspace(起始值,终值,元素个数) --创建等步长的数组 ...

  6. linux 查看和设置主机名

    1.设置主机名 通过编辑/etc/sysconfig/network文件中的HOSTNAME字段就可以修改主机名.如下所示: [root@zijuan /]# vim /etc/sysconfig/n ...

  7. 直播软件开发之Java音视频解决方案:音视频基础知识

    概念 从信息论的观点来看,描述信源的数据是信息和数据冗余之和,即:数据=信息+数据冗余.音频信号在时域和频域上具有相关性,也即存在数据冗余.将音频作为一个信源,音频编码的实质是减少音频中的冗余. 拟信 ...

  8. c#三角形

    int n = 10; for (int i = 1; i <= n; i++) { Console.Write(new string(' ', n - i)); for (int j = 1; ...

  9. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  10. HTTPDNS开源 Android SDK,赋能更多开发者参与共建

    为赋能更多开发者参与共建,阿里云HTTPDNS开源 Android SDK,iOS SDK也在做开源准备,不久也将开放给开发者.HTTPDNS是阿里云移动研发平台面向多端应用(移动端APP,PC客户端 ...