给定一个密钥字符串S,只包含字母,数字和 '-'。N 个 '-' 将字符串拆分成 N+1 组。给一个数字 K,格式化字符串,除了第一个分组以外,其余每个分组要包含 K 个字符,第一个分组至少要包含 1 个字符。两个分组之间用 '-'隔开,并且将所有的小写字母转换为大写字母。

示例 1:

输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
  注意,两个额外的破折号需要删掉。

示例 2:

输入:S = "2-5g-3-J", K = 2
输出:"2-5G-3J"
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

答案:

 1public String licenseKeyFormatting(String S, int K) {
2    String[] strs = S.split("-");
3    StringBuilder rst = new StringBuilder();
4    int gap = 'A' - 'a';
5    for (String str : strs) {
6        rst.append(str);
7    }
8    int len = rst.length();
9    for (int i = 0; i < len; i++) {
10        char c = rst.charAt(i);
11        if (c >= 'a' && c <= 'z') {
12            rst.setCharAt(i, (char) (c + gap));
13        }
14    }
15    for (int i = len - K; i > 0; i -= K) {
16        rst.insert(i, '-');
17    }
18    return rst.toString();
19}

解析:

先把“-”去掉,再把小写字母变成大写字母,最后在按照“-”进行分隔。还可以更简洁一些,看下面代码

1public String licenseKeyFormatting(String s, int k) {
2    StringBuilder sb = new StringBuilder();
3    for (int i = s.length() - 1; i >= 0; i--)
4        if (s.charAt(i) != '-')
5            sb.append(sb.length() % (k + 1) == k ? '-' : "").append(s.charAt(i));
6    return sb.reverse().toString().toUpperCase();
7}

或者

 1public String licenseKeyFormatting(String S, int K) {
2    S = S.replaceAll("[-]""");
3    S = S.toUpperCase();
4    StringBuilder sb = new StringBuilder();
5    sb.append(S);
6
7    int i=sb.length()-K;
8    while(i>0) {
9        sb.insert(i, '-');
10        i = i-K;
11    }
12    return sb.toString();
13}