Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
s = "3[a]2[bc]", return "aaabcbc" s = "3[a2[c]]", return "accaccacc" s = "2[abc]3[cd]ef", return "abcabccdcdcdef"
DecodeHelper class
public class DecodeHelper { private Integer idx; private String zero; public String decodeString(String s) { zero ='0'; idx = 0; return decodeStringHelper(s); } private String decodeStringHelper(String s) { String ans = ''; Integer repeat = 0; while (idx < s.length()) { Integer ch = s.charAt(idx); Integer[] intArr = new Integer[1]; intArr[0] = ch; String chStr = String.fromCharArray(intArr); if (chStr == ']') { return ans; } else if (chStr == '[') { ++idx; String str = decodeStringHelper(s); while (repeat > 0) { ans+=str; --repeat; } } else if (chStr.isNumeric()) { repeat = repeat * 10 + ch - zero.charAt(0); } else { ans+=chStr; } ++idx; } return ans; } }
DecodeHelper Test
@isTest class DecodeHelperTest { @isTest static void testDecodeString(){ Test.startTest(); DecodeHelper dh = new DecodeHelper(); String decodedString1 = dh.decodeString('3[a]2[bc]'); System.assertEquals(decodedString1, 'aaabcbc'); String decodedString2 = dh.decodeString('3[a2[c]]'); System.assertEquals(decodedString2, 'accaccacc'); String decodedString3 = dh.decodeString('2[abc]3[cd]ef'); System.assertEquals(decodedString3, 'abcabccdcdcdef'); Test.stopTest(); } }