394-文字列復号
3289 ワード
394-文字列復号
符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、k[encoded_string]であり、カッコ内のencoded_を表すstringはちょうどk回繰り返します.注意kは正の整数であることを保証する.
入力文字列は常に有効であると考えられます.入力文字列には余分なスペースがなく、入力した四角カッコは常にフォーマットの要件を満たしています.
また、元のデータには数字は含まれておらず、すべての数字は重複回数kのみを表し、例えば3 aや2[4]のような入力は現れないと考えられます.
例:
s = "3[a]2[bc]", "aaabcbc".
s = "3[a2[c]]", "accaccacc".
s = "2[abc]3[cd]ef", "abcabccdcdcdef".
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/decode-string著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
public String decodeString(String s) {
char[] chs = s.toCharArray();
Stack strs = new Stack<>();
Stack nums = new Stack<>();
StringBuilder tmp = new StringBuilder();
StringBuilder res = new StringBuilder();
for (int i = 0; i < chs.length; i++) {
char c = chs[i];
if (Character.isDigit(c)) {
int k = c - '0';
i++;
while (Character.isDigit(chs[i])) {
k = k * 10 + chs[i++] - '0';
}
nums.push(k);
if(tmp.length() != 0) {
strs.push(tmp.toString());
tmp = new StringBuilder();
}
} else if (c == ']') {
String ss = "";
if(nums.size() == strs.size()) {
ss = strs.pop();
}
int k = nums.pop();
StringBuilder t = new StringBuilder();
while (k > 0) {
t.append(ss).append(tmp);
k--;
}
tmp = t;
} else if (c != '['){
tmp.append(c);
}
if(nums.isEmpty()) {
res.append(tmp);
tmp = new StringBuilder();
}
}
return res.toString();
}
public String decodeString(String s) {
char[] chs = s.toCharArray();
Stack strs = new Stack<>();
Stack nums = new Stack<>();
StringBuilder tmp = new StringBuilder();
int k = 0;
for (int i = 0; i < chs.length; i++) {
char c = chs[i];
if (Character.isDigit(c)) {
while (Character.isDigit(chs[i])) {
k = k * 10 + chs[i++] - '0';
}
i--;
} else if (c == ']') {
String ss = strs.pop();
int pop = nums.pop();
StringBuilder t = new StringBuilder(ss);
while (pop > 0) {
t.append(tmp);
pop--;
}
tmp = t;
} else if (c != '['){
tmp.append(c);
} else {
nums.push(k);
strs.push(tmp.toString());
tmp = new StringBuilder();
k = 0;
}
}
return tmp.toString();
}