【发布时间】:2015-11-19 21:02:01
【问题描述】:
我最近遇到了这个问题 - 给定一个二进制字符串,检查我们是否可以将字符串分割/分割成 0..n 个部分,使得每个部分都是 5 的幂。返回最小分割数,如果可以的话。
例如:
input = "101101" - returns 1, as the string can be split once to form "101" and "101",as 101= 5^1.
input = "1111101" - returns 0, as the string itself is 5^3.
input = "100"- returns -1, as it can't be split into power(s) of 5.
我想出了这个递归算法:
- 检查字符串本身是否是5的幂,如果是,返回0
- 否则,逐个字符地遍历字符串,在每个点检查目前看到的数字是否为 5 的幂。如果是,则将 1 添加到拆分计数并递归检查字符串的其余部分是否为 5 的幂从第 1 步开始。
- 返回到目前为止看到的最小分割数。
我在 Java 中实现了上述算法。我相信它可以正常工作,但它是一个简单的递归解决方案。可以使用动态规划来解决这个问题以提高运行时间吗?
代码如下:
public int partition(String inp){
if(inp==null || inp.length()==0)
return 0;
return partition(inp,inp.length(),0);
}
public int partition(String inp,int len,int index){
if(len==index)
return 0;
if(isPowerOfFive(inp,index))
return 0;
long sub=0;
int count = Integer.MAX_VALUE;
for(int i=index;i<len;++i){
sub = sub*2 +(inp.charAt(i)-'0');
if(isPowerOfFive(sub))
count = Math.min(count,1+partition(inp,len,i+1));
}
return count;
}
辅助函数:
public boolean isPowerOfFive(String inp,int index){
long sub = 0;
for(int i=index;i<inp.length();++i){
sub = sub*2 +(inp.charAt(i)-'0');
}
return isPowerOfFive(sub);
}
public boolean isPowerOfFive(long val){
if(val==0)
return true;
if(val==1)
return false;
while(val>1){
if(val%5 != 0)
return false;
val = val/5;
}
return true;
}
【问题讨论】:
-
输入长度有什么限制?
标签: algorithm recursion dynamic-programming