给定一个密钥字符串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}