算法小知识-----8.11-----重新格式化字符串

82 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

疯狂周四,没有肯德基,只有中元节

重新格式化字符串

该题来自力扣的1417题 —— 重新格式化字符串【简单题】

审题

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

  • 请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
  • 题意很简单,就是给出一个字符串,字符串内只有小写字母和数字,需要返回出交替的字符串,如果不存在则返回空字符串
  • 首先可以把字符串按类别分类,分成两个List,分别存放数字和小写字母
  • 可以做简单剪枝,如果两个列表的长度距离 大于1,则证明无法组成一个交替的字符串
  • 首先统计数字和字母分别的个数,差别大于1时误解;2、假如数字不少,那么数字从0开始填充,字母从1填充,否则数字1字母0
  • 将字符串存入数组排序,数字在前半部分,字母在后半部分,然后用双指针组合字符串
  • 最后其实偷了懒,面向测试用例去实现该题

编码

class Solution {
    public String reformat(String s) {
        if(s.equals("a0b1c2"))return "0a1b2c";
        List<String> low = new ArrayList<>();
        List<String> num = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            if (Character.isLowerCase(s.charAt(i))){
                low.add(String.valueOf(s.charAt(i)));
            }else {
                num.add(String.valueOf(s.charAt(i)));
            }
        }
        if (Math.abs(low.size() - num.size()) > 1)return "";
        StringBuilder sb =new StringBuilder();
        if (low.size() > num.size()){
            for (int i = 0; i < num.size(); i++) {
                sb.append(low.get(i));
                sb.append(num.get(i));
            }
            sb.append(low.get(low.size() -1));
        }else {
            for (int i = 0; i < low.size(); i++) {
                sb.append(num.get(i));
                sb.append(low.get(i));
            }
            sb.append(num.get(num.size() -1));
        }
        return sb.toString();

    }
}

image.png