|
| 1 | +```java |
| 2 | +package main.java; |
| 3 | + |
| 4 | +/** |
| 5 | + * Lixiaomin l00495964对所有人说说: 08:14 PM |
| 6 | + * 有一种速记方式,针对重复内容有一套独特的缩写规则: |
| 7 | + * 1.重复的部分会被以 "(重复内容)<重复次数>" 形式记录,并且可能存在嵌套缩写关系。不重复的部分按照原样记录。 |
| 8 | + * <p> |
| 9 | + * 现给一个符合此速记方式的字符串 records,请以字符串形式返回复原后的内容。 |
| 10 | + * 注: records 仅由小写字母、数字及<, >, (, )组成。 |
| 11 | + * <p> |
| 12 | + * 示例 1: |
| 13 | + * <p> |
| 14 | + * 输入:records = "abc(d)<2>e" |
| 15 | + * <p> |
| 16 | + * 输出:"abcdde" |
| 17 | + * <p> |
| 18 | + * 解释:字符串中出现 "(d)<2>",表示 "d" 重复出现 2 次,因此返回复原后的内容 "abcdde"。 |
| 19 | + * <p> |
| 20 | + * 示例 2: |
| 21 | + * <p> |
| 22 | + * 输入:records = "a(b(c)<3>d)<2>e" |
| 23 | + * <p> |
| 24 | + * 输出:"abcccdbcccde" |
| 25 | + * <p> |
| 26 | + * 解释:字符串中出现 "a(b(c)<3>d)<2>",其中 "(c)<3>" 表示 "c" 出现 3 次,复原为 "ccc";"(bcccd)<2>" 表示 "bcccd" 重复出现 2 次,复原为 "bcccdbcccd"。最终返回复原后内容 "abcccdbcccde" |
| 27 | + * <p> |
| 28 | + * 提示: |
| 29 | + * •1 <= records.length <= 200 |
| 30 | + * •2 <= 重复次数 <= 10 |
| 31 | + * •题目保证返回结果字符串长度小于等于 10^4 |
| 32 | + * •输入保证合法,确保括号与尖括号成对出现 |
| 33 | + * •嵌套深度不超过 13 |
| 34 | + */ |
| 35 | +public class Main { |
| 36 | + |
| 37 | + public static void main(String[] args) { |
| 38 | + // String s = "a(b(c)<3>d)<2>e"; |
| 39 | + // String s3 = "abc(d)<2>e"; |
| 40 | + // System.out.println(solv(s)); |
| 41 | + // System.out.println(solv(s3)); |
| 42 | + String a = "a"; |
| 43 | + String b = new String("a"); |
| 44 | + } |
| 45 | + |
| 46 | + private static String solv(String s) { |
| 47 | + int length = s.length(); |
| 48 | + StringBuilder sb = new StringBuilder(); |
| 49 | + int firstIndex = s.indexOf("<"); |
| 50 | + int nextIndex = s.indexOf(">"); |
| 51 | + int num = Integer.parseInt(s.substring(firstIndex + 1, nextIndex)); |
| 52 | + int firstCharIndex = firstIndex - 1; |
| 53 | + int nextCharIndex = 0; |
| 54 | + String leftStr = s.substring(0, firstCharIndex); |
| 55 | + nextCharIndex = leftStr.lastIndexOf('('); |
| 56 | + String charRes = s.substring(nextCharIndex + 1, firstCharIndex); |
| 57 | + StringBuilder tempSb = new StringBuilder(); |
| 58 | + for (int i = 0; i < num; i++) { |
| 59 | + tempSb.append(charRes); |
| 60 | + } |
| 61 | + charRes = tempSb.toString(); |
| 62 | + for (int i = 0; i < length; ) { |
| 63 | + if ((i < nextCharIndex || i > firstCharIndex) && (i < firstIndex || i > nextIndex)) { |
| 64 | + sb.append(s.charAt(i)); |
| 65 | + } else if (i == firstIndex) { |
| 66 | + i = nextIndex; |
| 67 | + sb.append(charRes); |
| 68 | + } |
| 69 | + i++; |
| 70 | + } |
| 71 | + if (sb.toString().contains("<")) return solv(sb.toString()); |
| 72 | + else return sb.toString(); |
| 73 | + } |
| 74 | +} |
| 75 | +``` |
0 commit comments