https://leetcode.com/problems/reorganize-string/description/
题目大意:给你一个字符串,相邻的字符不能相同,问能否将这个字符串变成这样。
解题思路:统计出每个字符出现的次数,若次数 > (字符长度+1 )/2 ,肯定不可能组成。 之后就是重新构造这个字符串,有一点小技巧,代码里有注释。
1.只有小写字符,可以在统计个数的时候没遇到一个次数+100 ,之后加上0-26 和 a-z对应的一个字符,这样既能知道,这个字符的个数,也能知道他是哪个字符。
2.排序之后是从小到大的顺序,所以先从第二位来放小的字符
class Solution {
public String reorganizeString(String S) {
int n = S.length();
int[] vis = new int[26];
StringBuilder str =new StringBuilder(S);
for(int i = 0; i< n ;i++) vis[S.charAt(i)-'a']+=100;
for(int i=0;i<26;i++) vis[i]+=i;
Arrays.sort(vis); // 从小到大
char[] res = new char[n];
// Arrays.fill(res,'#');
int t = 1; //因为是从小到大,所以先从第二位开始放
for(int i=0;i<26;i++)
{
int cnt = vis[i]/100 ;
if( cnt > (n+1)/2) return "";
for(int j=0;j<cnt;j++)
{
res[t] = (char)('a'+vis[i]%100);
t+=2;
if(t>=n) t=0;
}
}
return String.valueOf(res);
}
}