给定一个整数N,N代表全部由0或者1字符组成的二进制字符串的长度,求该长度下,所有满足0的左边必有1的字符串的数量
分析:
1)暴力方法时间复杂度为 2^n * n
2)优化算法:先分析题意,要求0的左边必有1,再次涉及到子串问题,且需连续,以动态规划来解决,按照以往的思路不难得出,dp[i]的值代表着,以 ,重新分析,在最大公共子串中,求最大公共子串,是从左到右遍历,i位置的值取决于i-1,且遍历到i时,是以i结尾。本题中, 依然是先确定字符串左边,再确定右边的动态,但相反的是dp值代表的却是在左边字符串的值定下后,右边能取多少数量。
3)以当前i为例子,当左边i-1取为1时,我i才能随意取1或者0,而我右边有多少种排列组合合适,我就都加进来,而左边是0的话,我i就只能取1,所以规定dp[i]的意义为 当i-1为1时,i位置包括往后的字符串能有多少种取法。(之所以这样取值,是因为只需要考虑一种情况,i-1=0时的取法值很显然已经在i-2时加进去了)
代码实现:
//0左边必有1的二进制字符串数量
public int get0_Left_1(int n){
if(n < 1){
return 0;
}
return 00;
}
public int process(int i, int n){
//如果i在倒数第二位了,能取俩 ,1 0 , 11
if(i == n-1){
return 2;
}
if(i == n){
return 1;
}
//这里为什么返回i+1位置的值加上i+2位置的值??
/**
* 解释:当i取1的时候, i+1位置的值可以任意取,取0或1都行 所以i+1位置的取法数量代表i取i的取法数量
* 当i取0的时候,i+1 只能取1,否则i和i+1的排列 成了 00 不满足0左边必为1,那i+1就只能取1的话
* i+1为1时有多少种取法,就取决于 i+2任意取的取法数量了,还是上面的思路,i+1取1了
* i+2就可以任意取了
*/
return process(i+1,n) + process(i + 2, n);
}