字符串:重组

    给定一个字符串,要求对其进行重组,使相同的字符不相邻,如果无法满足要求,则返回空串。如字符串“aab”,重组后为“aba”。

    分析:先统计每个字符出现的次数,把字符和次数存入HashMap中,对HashMap根据次数进行排序,然后再进行重组:前一半append,后一半间隔插入。(其实也可以不用排序,只需找到出现次数最多的那个字符,先append该字符即可)

    public String reorganizeString(String S) {
    		StringBuilder sb = new StringBuilder();
    		Map<Character, Integer> map = new HashMap<Character, Integer>();
    		for(int i = 0; i < S.length(); i++) {
    			int num = map.getOrDefault(S.charAt(i), 0) + 1;
    			if(num > Math.ceil((double)S.length() / 2)) return ""; //如果一个字符出现次数大于字符串长度的一半,无解
    			map.put(S.charAt(i), num);
    		}
    		List<Map.Entry<Character, Integer>> list = new LinkedList<Map.Entry<Character, Integer>>(map.entrySet());
    		Collections.sort(list, (Map.Entry<Character, Integer> e1, Map.Entry<Character, Integer> e2) -> (e2.getValue() - e1.getValue()));
    		int listIndex = 0, chIndex = 1, i = 0;
    		while(sb.length() < S.length()) {
    			if(sb.length()  <  Math.ceil((double)S.length() / 2)) {
    				sb.append(list.get(listIndex).getKey());
    			}
    			else {
    				sb.insert(i * 2 + 1, list.get(listIndex).getKey());
    				i++;
    			}
			if(chIndex < list.get(listIndex).getValue()) {
				chIndex ++;
			}
			else {
				listIndex ++;	
				chIndex = 1;
			}	
    		}
	    return sb.toString();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值