[英]Java - How to decode a string recursively
我需要解碼一個遞歸編碼為計數的字符串,后跟子字符串
給定一個編碼字符串(s),任務是對其進行解碼。 字符串編碼的模式如下。
例子:
輸入:str[] = "1[b]" 輸出:b
輸入:str[] = "2[ab] 輸出:abab
輸入:str[] = "2[a2[b]]" 輸出:abbabb
輸入:str[] = "3[b2[ca]]" 輸出:bcacabcacabcaca
下面是我試圖實現相同的代碼。 我所知道的是它可以使用兩個堆棧來解決。
public class Main {
public static void main(String[] args) {
Stack<Interger> s1 = new Stack();
Stack<String> s2 = new Stack();
String result = "";
for(int i = 0; i < args.length; i++){
if(Interger.parseInt(args[i]) == 0){
s1.push(args[i]);
}
if(args[i] == 0){
if(args[i] == ']'){
result = s2.pop();
}
if(args[i] == '['){
continue;
}
s2.push(args[i])
}
}
}
}
誰能幫助我編寫代碼以獲得預期輸出的有效方法是什么?
如何遞歸解碼字符串
您需要定義基本案例和遞歸案例:
基本情況- 給定的字符串不包含方括號[]
,因此無需處理它。 返回值是給定的字符串本身。
遞歸案例- 我們需要確定開始[
和結束括號]
的索引,並基於該合同一個新的字符串。
這就是它的實現方式:
public static String decode(String str) {
int startOfBrackets = str.indexOf('[');
if (startOfBrackets == -1) { // base case there's no square brackets in the string
return str;
}
int startOfDigits = getFirstDigitsPosition(str);
int repeatNum = Integer.parseInt(str.substring(startOfDigits, startOfBrackets));
return str.substring(0, startOfDigits) +
decode(str.substring(startOfBrackets + 1, str.length() - 1)).repeat(repeatNum);
}
public static final Pattern SINGLE_DIGIT = Pattern.compile("\\d");
public static int getFirstDigitsPosition(String str) {
Matcher matcher = SINGLE_DIGIT.matcher(str);
if (matcher.find()) {
return matcher.start();
}
return -1;
}
main()
public static void main(String[] args) {
System.out.println(decode("1[b]"));
System.out.println(decode("2[ab]"));
System.out.println(decode("2[a2[b]]"));
System.out.println(decode("3[b2[ca]]"));
}
輸出:
abab
abbabb
bcacabcacabcaca
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.