繁体   English   中英

算法不适用于字符串解码方式--,leetcode 91。--我需要 output 的解决方案而不是计数。 附代码

[英]Algo not working for String Decode Ways -- , leetcode 91. --I need output of solutions and not count. Code Attached

所以我用动态编程解决了这个leetcode问题 --> https://leetcode.com/problems/decode-ways/

但是,在解决下图中给出的类似问题时遇到了麻烦。 我们需要实际打印所有字符串解码而不是计算它们,我在下面附加了这个代码,但它不适用于长度超过 2 的任何字符串。我做错了什么? 在此处输入图像描述

package MiscStringQs;

import java.util.ArrayList;
import java.util.Scanner;

public class printDecodeWays {
    static String str;
    static Scanner sc=new Scanner(System.in);
    
    public static void main(String[] args) {
        input();
        System.out.println(decodeString());
    }
    
    public static void input() {
        str  = sc.next();
    }
    
    public static ArrayList<String> decodeString() {
        if(str.charAt(0)=='0') {
            ArrayList<String> ans = new ArrayList<>(); ans.add("");
            return ans;
        }
        if(str.length()==1) {
            ArrayList<String> ans = new ArrayList<>(); ans.add(Character.toString(str.charAt(0)+48));
            return ans;
            
        }
        int N = str.length();

        char scan; 
        
        ArrayList <String> ans1 = new ArrayList<>(); //ans1.add("");
        ArrayList <String> ans2 = new ArrayList<>(); //ans2.add("");
        ArrayList <String> prevAns = new ArrayList<>(); prevAns.add("");
        
        String fetch = Character.toString(str.charAt(0)+48); //convert number to alphabet mapping
        ans1.add(fetch);
        String tempStr;

        char prev=str.charAt(0); 

        for(int i=2;i<=N;i++) {
            int strIndex = i-1; 
            scan  = str.charAt(strIndex);
            
            if(scan != '0') {
                for(int j=0;j<ans1.size();j++) {
                     tempStr = ans1.get(j) + Character.toString(scan+48);
                     ans2.add(j, tempStr);
                    
                    if(ans1.size()>4) {
                        System.exit(0);
                    }
                }
            
            }
            if( checkNo(prev,scan) <=26 ) {
                
                for(int j=0;j<prevAns.size();j++) {
                    
                    String comboStr =  Character.toString(prev)+ Character.toString(scan);
                    int comboInt = Integer.parseInt(comboStr);
                    char comboChar = (char) (comboInt + 96);
                    
                    tempStr = prevAns.get(j) + Character.toString(comboChar);
                    ans2.add(tempStr);
        
                }   
            }
            
            prevAns = (ArrayList<String>) ans1.clone();
            ans1= (ArrayList<String>) ans2.clone();
            prev = scan; 
        }
        
        return ans2; 
    }
    
    public static int checkNo(char prev,char scan) {
        return 10* (prev-'0') + (scan-'0');
    }
}

对于您的示例“1125”,您首先取最后一个数字 5,得到字符“e”,现在您的字符串是“e”,使用该字符串在剩余的数字“112”上递归。 同样取最后两个数字25,得到字符'y',现在你的字符串是“y”,手头的字符串递归剩余的数字“11”。

递归时要小心 j = 10。

代码将是:

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        getAllStrings(list, 1125, "");
        System.out.println(list);
        list = new ArrayList<>();
        getAllStrings(list, 10101, "");
        System.out.println(list);
    }
    
    private static void getAllStrings(List<String> list, int n, String s) {
        if ( n == 0 ) {
            return;
        } else if ( n < 11 ) {
           list.add(String.valueOf((char)(96+n)) + s);
        } else if ( n < 27 ) {
           list.add(String.valueOf((char)(96+n)) + s);
           if ( n % 10 != 0 ) {
                getAllStrings(list, n/10, String.valueOf((char)(96+n%10)) + s);
            }
        } else {
            if ( n % 10 != 0 ) {
                getAllStrings(list, n/10, String.valueOf((char)(96+n%10)) + s);
            }
           if (( n - n % 10) % 100 != 0 ) {
               getAllStrings(list, n/100, String.valueOf((char)(96+n%100)) + s);
           }
           
        }
    }
}

Output:

[kbe, aabe, ale, ky, aay]
[jja]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM