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

又名 D

所以我使用动态编程解决了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);
           }
           
        }
    }
}

输出:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

leetcode: 解码方式 dp 解决方案

Leetcode 解决方案适用于我的计算机,但不适用于网站(有效括号)

选择字符串不适用于使用输出字符串的管道对象

用于检查字符串中的所有字符是否唯一的 Java 算法不适用于 Hashmap?使用地图运算符有更好的解决方案吗?

PHP字符串到整数的转换不适用于此代码

VSCode代码段扩展不适用于字符串

jQuery attr的字符串操作,不适用于我

整数的 push_back 不适用于我的字符串向量

用于打印字符串的 ASCII 的简单代码程序(每个字符)不适用于输入案例

[leetcode 5]我无法找到最长回文子串问题的解决方案中的问题

查找最小窗口子字符串-leetcode-解决方案不起作用

为什么此解决方案不适用于硬币找零算法?

尝试复制工作表中的所有单元格时出现错误91。但仅适用于某些代码

无法弄清楚为什么我的代码不适用于特殊情况(从Leetcode更换硬币)

leetcode 上的字符串 a 到 i 问题我的解决方案在出现 2 个连续符号的情况下失败

助焊剂解码异常:意外字符(“ [”(代码91)):期望双引号开头字段名称

计数字符串中的字符不适用于制表符('\ t')。我使用错误的方法吗?

JuMP查询解决方案不适用于for循环

Javascript Diff算法不适用于HTML代码

Dijkstra算法实现-代码不适用于较大的输入

Powershell此处字符串换行符不适用于输出文件

方法仅适用于.select或.reject,不适用于.map解决方案

vscode omnisharp不适用于解决方案,但适用于项目

加速的C ++ 14-5:自定义字符串类和引用计数器适用于一个构造函数,但不适用于另一个构造函数

为什么 datetime.strptime 不适用于 numpy 给出 ' float() 参数必须是字符串或数字,而不是 'datetime.datetime' '

LeetCode python 递归解决方案

字符计数不适用于动态输入

scanf单字符不适用于我的循环

为什么我的 sqlplus 字符串连接仅适用于 /service_name 而不适用于 :service_name