给定一个字符串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. SP22343 Norma--序列分治

    Norma 传送门 题意简化: 定义一个区间的贡献为 \(max*min*len\),求给定序列中所有子区间的总贡献和 题解 考虑 \(O(n*log_2n)\) 的复杂度的做法 数据结构??? yz ...

  2. PHP实现页面静态化的简单方法分享

    为什么要页面静态化? 1.动态文件执行过程:语法分析-编译-运行 2.静态文件,不需要编译,减少了服务器脚本运行的时间,降低了服务器的响应时间,直接运行,响应速度快:如果页面中一些内容不经常改动,动态 ...

  3. Java_包装类

    包装类 在实际应用中, 经常需要把基本数据类型转化为对象以便操作. 因此, Java在设计类时, 为每个基本数据类型设计了一个对应的类进行包装, 这样八个和基本数据类型对应的类统称为包装类(Wrapp ...

  4. python实现年会抽奖程序

    用python来实现一个抽奖程序,供大家参考,具体内容如下 主要功能有 1.从一个csv文件中读入所有员工工号2.将这些工号初始到一个列表中3.用random模块下的choice函数来随机选择列表中的 ...

  5. Pycharm激活码,2020年9月29日最新激活码

    分享一个Pycharm激活码给大家: 5MJ8MJ2T1Q-eyJsaWNlbnNlSWQiOiI1TUo4TUoyVDFRIiwibGljZW5zZWVOYW1lIjoi6I635Y+W77yaIG ...

  6. java实现一个简单的单链表反转

    自定义一个单链表,实现链表反转: 1.普通方法实现 2.递归方式实现 package listNode; public class ReverseNode { public static void m ...

  7. 简单STL

    string: string s="5418340"; sort(s.begin(),s.end()); cout<<s; /**begin是头迭代器,end是尾迭代器 ...

  8. orphan sockets

    orphan sockets 介绍一下什么是 orphan sockets,简单来说就是该 socket 不与任何一个文件描述符相关联.例如,当应用调用 close() 关闭一个链接时,此时该 soc ...

  9. Go语言内存分配(简述 转)

    在Go语言里,从内存的分配到不再使用后内存的回收等等这些内存管理工作都是由Go在底层完成的.虽然开发者在写代码时不必过度关心内存从分配到回收这个过程,但是Go的内存分配策略里有不少有意思的设计,通过了 ...

  10. Linux配置邮件发送信息

    背景 一般情况下,我们的IT系统都会有相关的告警的处理,有的是邮件,有的是短信,这些都能很方便的获得一些有用的信息 在某些时候我们没有这样的系统,而自己又需要定期的获取一些信息的时候,配置一个邮件发送 ...