1.最开始用递归做的
答案比解多 不知道有没有大佬知道为什么。
可能是递归过程中 对于同一个可能进行了重复计算?

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String mos = in.nextLine();

        int res = recur(mos);
        System.out.println(res);
    }
    public static int recur(String mos){
        if(mos.equals("0")  || mos.equals("1") ){ return 1;}
        if(mos.equals("10") || mos.equals("11")){ return 2;}
        if(mos.equals("100") || mos.equals("101")){ return 3;}
        if(mos.equals("110") ||  mos.equals("111")) { return 4;}

        return  recur(mos.substring(0,mos.length()-1)) +
                recur(mos.substring(0,mos.length()-2)) +
                recur(mos.substring(0,mos.length()-3)) ;
    }
}

2.
字符串 想截取到第i位 就是 substring(i-1,i) 因为是从0开始计算的
在字符串数组中是左闭右开的
第i位 是 数组中的i-1位

看了别人的思路动态规划

知道 111001 可以分三种 (6位)
11100,1
1110,01
111,001
三种分法
后面的就固定不动 不能够再分割了 例如第二行的末尾的01 就不能再拆分为0,1
这样问题就变成了 6位 能否变成 11100 + 1110 + 111 三种解法的和
首先
dp[i]一定等于dp[i-1] 即必定可以拆分为 前面的字符串+1或者0
判断能否 1110,01 这么拆分 如果可以 dp[i] = dp[i-1] + dp[i-2];
主要看i-1位的数值,如果i-1位的数值位0 那么 就不可拆分成01或者00,因为这个不存在,0,0 0,1在上一步已经包含了
如果i-1位的数值位1 那么 后两位就可以拆分为10,11 这是存在的。

i-2 位同理,0开头就不能拆 1开头就可以拆

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String mos = in.nextLine();

        if(mos.length()<2) {
            System.out.println(mos.length());
            return;
        }

        int [] dp = new int [mos.length()+1];

        dp[0] = 1;
        dp[1] = 1;

        for(int i =2 ;i<= mos.length(); i++){
            dp[i] = dp[i-1];
            if(mos.substring(i-2,i-1).equals("1")){
                dp[i] += dp[i-2];
            }
            if(i>=3 && mos.substring(i-3,i-2).equals("1")){
                dp[i] += dp[i-3];
            }
        }
        System.out.println(dp[mos.length()]);
    }
}